Dim*_*ira 10 android kotlin kotlin-coroutines
我最近潜入Kotlin协同程序因为我使用了很多Google的库,所以大部分工作都是在Task类中完成的
目前我正在使用此扩展来暂停协程
suspend fun <T> awaitTask(task: Task<T>): T = suspendCoroutine { continuation ->
task.addOnCompleteListener { task ->
if (task.isSuccessful) {
continuation.resume(task.result)
} else {
continuation.resumeWithException(task.exception!!)
}
}
}
Run Code Online (Sandbox Code Playgroud)
但最近我见过这样的用法
suspend fun <T> awaitTask(task: Task<T>): T = suspendCoroutine { continuation ->
try {
val result = Tasks.await(task)
continuation.resume(result)
} catch (e: Exception) {
continuation.resumeWithException(e)
}
}
Run Code Online (Sandbox Code Playgroud)
有什么区别,哪一个是正确的?
UPD:第二个例子不起作用,idk为什么
Rom*_*rov 17
传递给suspendCoroutine { ... }它的代码块不应该阻塞它被调用的线程,允许协程被挂起.这样,实际线程可以用于其他任务.这是一个关键功能,允许Kotlin协程扩展并在单个UI线程上运行多个协同程序.
第一个例子是正确的,因为它调用task.addOnCompleteListener(参见docs)(它只是添加一个监听器并立即返回.这就是为什么第一个正常工作的原因.
第二个示例使用Tasks.await(task)(请参阅docs)来阻止调用它的线程,并且在任务完成之前不会返回,因此它不允许协程正确挂起.
| 归档时间: |
|
| 查看次数: |
2523 次 |
| 最近记录: |