Kotlin-此处映射-从回调函数中获取地址
我试图从回调函数中获取地址。我一直在阅读回调的文档和一些帖子,但仍然不明白为什么这不起作用,因为在返回“address”变量时,回调已经完成了 提前谢谢你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 =
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()函数及其相关参数的详细文档,请参阅以下链接
<