[Kotlin协程问题...正在使用属性而不是使用函数作为异步调用的访问器而苦苦挣扎。
[背景是我正在尝试将FusedLocationProviderClient
与kotlinx-coroutines-play-services
库一起使用,以便在.await()
上使用Task
方法而不是添加回调...
当前有一个属性获取器被踢到暂停函数,但不确定如何正确启动协程以避免该问题
找到所需的单位XYZ
错误...
val lastUserLatLng: LatLng?
get() {
val location = lastUserLocation
return if (location != null) {
LatLng(location.latitude, location.longitude)
} else {
null
}
}
val lastUserLocation: Location?
get() {
GlobalScope.launch {
return@launch getLastUserLocationAsync() <--- ERROR HERE
}
}
private suspend fun getLastUserLocationAsync() : Location? = withContext(Dispatchers.Main) {
return@withContext if (enabled) fusedLocationClient.lastLocation.await() else null
}
关于如何处理此问题的任何想法?
属性不能异步。通常,您不应该同步异步调用。您需要返回一个Deferred
并在需要一个值时对其调用await()
。
val lastUserLatLng: Deferredd<LatLng?>
get() = GlobalScope.async {
lastUserLocation.await()?.run {
LatLng(latitude, longitude)
}
}
val lastUserLocation: Deferred<Location?>
get() = GlobalScope.async {
getLastUserLocationAsync()
}
private suspend fun getLastUserLocationAsync() : Location? = withContext(Dispatchers.Main) {
return@withContext if (enabled) fusedLocationClient.lastLocation.await() else null
}
但是从技术上讲,这是可能的,尽管您应该not这样做。 runBlocking()
阻塞,直到有值可用并返回为止。