在Task <T>完成之前,正确暂停协程的方法

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)阻止调用它的线程,并且在任务完成之前不会返回,因此它不允许协程正确挂起.