Kotlin-此处映射-从回调函数中获取地址

Kotlin-此处映射-从回调函数中获取地址,kotlin,here-api,asynccallback,heremaps-android-sdk,Kotlin,Here Api,Asynccallback,Heremaps Android Sdk,我试图从回调函数中获取地址。我一直在阅读回调的文档和一些帖子,但仍然不明白为什么这不起作用,因为在返回“address”变量时,回调已经完成了 提前谢谢你 private fun getAddressForCoordinates(geoCoordinates: GeoCoordinates):String { address = "unchanged" val maxItems = 1 val reverseGeocodingOptions =

我试图从回调函数中获取地址。我一直在阅读回调的文档和一些帖子,但仍然不明白为什么这不起作用,因为在返回“address”变量时,回调已经完成了

提前谢谢你

    private fun getAddressForCoordinates(geoCoordinates: GeoCoordinates):String {
    address = "unchanged"
    val maxItems = 1
    val reverseGeocodingOptions = SearchOptions(LanguageCode.EN_GB, maxItems)
    searchEngine.search(geoCoordinates, reverseGeocodingOptions, addressSearchCallback)

    return address

}

private val addressSearchCallback =
    SearchCallback { searchError, list ->
        if (searchError != null) {
            //showDialog("Reverse geocoding", "Error: $searchError")
            Toast.makeText(context, "Error: $searchError", Toast.LENGTH_LONG).show()
            return@SearchCallback
        }

        Toast.makeText(
            context,
            "Reverse geocoded address:" + list!![0].address.addressText,
            Toast.LENGTH_LONG
        ).show()

        address = list[0].address.addressText
    }

根据您的代码和注释,我假设您不熟悉异步执行的概念。这一概念描述得很好。我将引述要点:

当你同步执行某件事情时,你会等待它完成 在开始另一项任务之前。当你执行某件事的时候 异步地,您可以在另一个任务完成之前继续执行该任务

search()
需要提供回调,而且它不只是返回搜索结果,这一事实很好地表明它很可能是异步的。调用它就像说:“在后台搜索数据,并在你有数据时告诉我。这是我的电子邮件地址-请将我的结果发送给我。”。其中电子邮件地址是您的回拨地址。调用
search()
方法不会阻止代码的执行,它不会等待结果-它只安排搜索并几乎立即返回

异步处理通常比常规的同步代码更复杂,但在许多情况下它更高效。在您的情况下,您可以尝试将库的原始异步API“转换”为代码所期望的同步API,但这不是推荐的方法。或者您可以重新设计代码,使其异步工作。例如,不要这样做:

fun yourMethodThatNeedsAddress() {
    val address = getAddressForCoordinates()
    doSomethingWithAddress(address)
}
您需要这样做:

fun yourMethodThatNeedsAddress() {
    scheduleGetAddressForCoordinates() // renamed getAddressForCoordinates()
}

fun addressSearchCallback() {
    ...
    doSomethingWithAddress(address)
}

所以,无论您打算对获取的地址做什么,您都无法在开始搜索后立即执行此操作。您需要等待回调,然后从那里继续处理您的地址。

来自4.x的搜索引擎需要在线连接,因为它正在从远程后端获取结果。这可能需要几毫秒,具体取决于您的网络连接。因此,无论何时执行搜索请求,都需要等待回调被调用:

searchEngine.search(geoCoordinates, reverseGeocodingOptions, addressSearchCallback)
调用此函数时,将
addressSearchCallback
作为参数传递。
addressSearchCallback
的实现可能与示例中的类似。只要操作完成,就会调用它。如果设备处于脱机状态,则会显示错误

请注意,
search()
方法不会立即返回任何结果。它们被传递到回调,回调在后台线程上异步发生。因此,您的应用程序可以在不阻塞任何UI的情况下继续工作

一旦检索到结果,回调将由主线程上的hereSDK执行

因此,如果代码需要对地址结果执行某些操作,则必须在
SearchCallback
定义的
onSearchCompleted()
方法中执行。如果用纯Java编写,而不使用lambda表示法,则更容易看到:创建一个新的
SearchCallback
对象,并将其作为参数传递给搜索引擎。搜索引擎存储对象,并在认为时机合适时执行对象的
onSearchCompleted()

private SearchCallback addressSearchCallback = new SearchCallback() {
    @Override
    public void onSearchCompleted(@Nullable SearchError searchError, @Nullable List<Place> list) {
        if (searchError != null) {
            showDialog("Reverse geocoding", "Error: " + searchError.toString());
            return;
        }

        // If error is null, list is guaranteed to be not empty.
        showDialog("Reverse geocoded address:", list.get(0).getAddress().addressText);

        // Here is the place to do something more useful with the Address object ...!
    }
};
private SearchCallback addressSearchCallback=new SearchCallback(){
@凌驾
已完成搜索(@Nullable-SearchError-SearchError,@Nullable-List-List){
if(searchError!=null){
showDialog(“反向地理编码”,“错误:+searchError.toString());
返回;
}
//若错误为null,则保证列表不为空。
showDialog(“反向地理编码地址:”,list.get(0.getAddress().addressText);
//这里是对Address对象做一些更有用的事情的地方。。。!
}
};
我从GitHub代码片段中获取了这个。请注意,还有一个
离线搜索引擎
,它在没有internet连接的情况下工作,但出于某种原因,它遵循相同的模式并异步执行任务。

私有void getAddressForCoordinates(地理坐标地理坐标){
private void getAddressForCoordinates(GeoCoordinates geoCoordinates) {
    int maxItems = 1;
    SearchOptions reverseGeocodingOptions = new SearchOptions(LanguageCode.EN_GB, maxItems);

    searchEngine.search(geoCoordinates, reverseGeocodingOptions, new SearchCallback() {
        @Override
        public void onSearchCompleted(@Nullable SearchError searchError, @Nullable List<Place> list) {
            if (searchError != null) {
                showDialog("Reverse geocoding", "Error: " + searchError.toString());
                return;
            }

            // If error is null, list is guaranteed to be not empty.
            showDialog("Reverse geocoded address:", list.get(0).getAddress().addressText);
        }
    });
}
int maxItems=1; SearchOptions reverseGeocodingOptions=新的搜索选项(LanguageCode.EN_GB,maxItems); searchEngine.search(地理坐标、反向分类选项、新的SearchCallback(){ @凌驾 已完成搜索(@Nullable-SearchError-SearchError,@Nullable-List-List){ if(searchError!=null){ showDialog(“反向地理编码”,“错误:+searchError.toString()); 返回; } //若错误为null,则保证列表不为空。 showDialog(“反向地理编码地址:”,list.get(0.getAddress().addressText); } }); }
SearchEngine,需要提供SearchOptions实例来设置所需的语言代码。它确定结果地址的语言。然后我们可以调用引擎的search()-方法在线搜索传递的坐标的地址。如果出现错误,例如设备脱机时,SearchError保留错误原因

反向地理编码响应包含错误或结果:SearchError和结果列表不能同时为null,也不能同时为非null

每个Place实例中包含的Address对象是一个数据类,它包含多个描述原始位置地址的字符串字段,例如国家、城市、街道名称等。有关更多详细信息,请参阅API参考。如果您只对接收可读的地址表示感兴趣,那么可以访问addressText,如上面的示例所示。这是一个字符串,包含最相关的地址详细信息,包括地名

有关search()函数及其相关参数的详细文档,请参阅以下链接

<