使用属性作为Kotlin Coroutine的访问器

问题描述 投票:0回答:1

[Kotlin协程问题...正在使用属性而不是使用函数作为异步调用的访问器而苦苦挣扎。

[背景是我正在尝试将FusedLocationProviderClientkotlinx-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
    }

关于如何处理此问题的任何想法?

android kotlin kotlin-coroutines fusedlocationproviderapi
1个回答
0
投票

属性不能异步。通常,您不应该同步异步调用。您需要返回一个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()阻塞,直到有值可用并返回为止。

© www.soinside.com 2019 - 2024. All rights reserved.