我想知道withContext后面的行(注意:以Dispatchers.IO为第一个参数)是如何被阻塞的。
它们似乎处于不同的线程上,但我想知道协同机制是如何顺序执行它们的。
fun deleteAll() {
viewModelScope.launch {
Log.d("tag", "Outside withContext(start): " + Thread.currentThread().name)
withContext(Dispatchers.IO) {
Log.d("tag", "Deleting....: " + Thread.currentThread().name)
delay(3_000)
Log.d("tag", "Done deleting.")
}
Log.d("tag", "Outside withContext(end): " + Thread.currentThread().name)
}
}输出:
ViewModel deleteAll returning
Outside withContext(start): main
Deleting....: DefaultDispatcher-worker-5
Done deleting.
Outside withContext(end): main发布于 2019-08-23 20:59:56
如果您查看withContext的定义,您会注意到它是一个挂起函数:
public suspend fun <T> withContext挂起函数由Kotlin编译器转换为连续函数。你可以把它看作是一连串的回调。
所以,你会得到这样的东西:
fun a() {
Log.d("tag", "Outside withContext(start): " + Thread.currentThread().name)
fun b() {
withContext(Dispatchers.IO) {
Log.d("tag", "Deleting....: " + Thread.currentThread().name)
delay(3_000)
Log.d("tag", "Done deleting.")
}
fun c() {
Log.d("tag", "Outside withContext(end): " + Thread.currentThread().name)
}
}()
}()现在,您可以更清楚地看到,在c()完成之前,不能执行b()。
另一种思考方法是查看withContext的代码
...
block.startCoroutineCancellable(coroutine, coroutine)
coroutine.getResult()
}在coroutine.getResults()完成之前,其他任何事情都不会发生。
https://stackoverflow.com/questions/57626173
复制相似问题