簡體   English   中英

使用協程執行的 Android kotlin 任務

[英]Android kotlin task to be executed using coroutines

例如,我使用 FusedLocationProviderClient 訪問當前位置,它返回一個任務,回調最終將返回該位置。 該方法如下所示:

fun getLocation(callback: MyCallback){
    val flpc = LocationServices.getFusedLocationProviderClient(it)
    flpc.lastLocation.addOnSuccessListener {
        callback.onLocation(it)
    }
}

是否可以對其進行轉換,以便我可以使用 corroutines 掛起此函數並等待flpc.lastLocation返回的任務,以便我可以在此方法中返回它並以這種方式擺脫該回調? 例如這樣的事情:

suspend fun getLocation(): Location? =
    withContext(Dispachers.IO){
        val flpc = LocationServices.getFusedLocationProviderClient(it)
        return@withContext flpc.lastLocation.result()
    }

我的問題是,協程是否可以返回Task的結果(在本例中為Task<Location>

提前致謝!

kotlinx-coroutines-play-services庫有一個Task<T>.await(): T helper。

import kotlinx.coroutines.tasks.await

suspend fun getLocation(): Location? = 
    LocationServices.getFusedLocationProviderClient(context).lastLocation.await()

或者看看阻塞任務

它將以下一種方式使用:

suspend fun getLocation(): Location? =
    withContext(Dispachers.IO){
        val flpc = LocationServices.getFusedLocationProviderClient(context)
        try{
            return@withContext Tasks.await(flpc.lastLocation)
        catch(ex: Exception){
            ex.printStackTrace()
        }
        return@withContext null
    }

只是為了添加到這個例子中,為了完成目的,對getLocation()的調用將通過以下方式完成:

coroutineScope.launch(Dispatchers.Main) {
    val location = LocationReceiver.getLocation(context)
    ...
}

然而,這通過不利用可用回調和阻塞 IO 調度程序上的線程來否定協程的好處,如果替代方案可用,則不應使用協程。

我這樣做的另一種方法也可以與任何回調類型接口一起使用是使用suspendCoroutine<T> {}

所以對於這個例子,它將是:

suspend fun getLocation(): Location? {
    return suspendCoroutine<Location?> { continuation ->
        val flpc = LocationServices.getFusedLocationProviderClient(it)
        flpc.lastLocation.addOnSuccessListener { location ->
            continuation.resume(location)
        }
        // you should add error listener and call 'continuation.resume(null)'
        // or 'continuation.resumeWith(Result.failure(exception))'
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM