例如,我正在使用FusedLocationProviderClient访问当前位置,它返回一个任务,回调将最终返回该位置。该方法如下所示:
fun getLocation(callback: MyCallback){
val flpc = LocationServices.getFusedLocationProviderClient(it)
flpc.lastLocation.addOnSuccessListener {
callback.onLocation(it)
}
}
是否可以对其进行转换,以便我可以使用例程来挂起此函数并等待返回的任务,flpc.lastLocation
以便可以用此方法将其返回,从而摆脱该回调?例如这样的事情:
suspend fun getLocation(): Location? =
withContext(Dispachers.IO){
val flpc = LocationServices.getFusedLocationProviderClient(it)
return@withContext flpc.lastLocation.result()
}
我的问题是协程周围是否有东西可以返回a的结果Task
(在本例中为a Task<Location>
)
提前致谢!
该kotlinx-coroutines-play-services
图书馆有一个Task<T>.await(): T
帮手。
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调度程序上的线程而否定了协程的好处,并且如果可用,则不应使用协程。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句