[英]Android: ViewModel test using kotlin coroutines not working
[英]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.