我一直在讨论协同机制,我想知道下面的代码。我在我的onCreate()上有以下操作。
asyncJob = GlobalScope.launch(Dispatchers.Main) {
val name = async(Dispatchers.Default) { queryDevices() }.await()
mDeviceName.text = deviceName
}打印出来后,执行的顺序似乎是在UI线程上的" name“之前,在设置了名称之后,它也出现在UI线程上。queryDevicesMethod()正处于预期的后台线程中。
但是我想知道,当在UI线程上调用它时,实际上在做什么?它是否阻塞theUI线程直到等待返回?
发布于 2018-12-13 06:31:49
协同线程在挂起时不会阻塞线程。Kotlin编译器生成一个状态机,该机器分离并将协同线与线程连接,请参阅https://github.com/Kotlin/kotlinx.coroutines/blob/master/ui/coroutines-guide-ui.md。
在您的例子中,GlobalScope.launch(Dispatchers.Main)启动了一个限制在UI线程上的新的协同线。然后,async()启动一个新的协同线,它仅限于另一个调度器。await()的调用是一个挂起函数,它将从UI线程中分离出第一个协同线,等待async-coroutine的完成。
顺便说一句:您不应该在一条语句中使用async和await。这没什么意义。您真正想要的是从另一个调度程序运行queryDevices()-function,而不是从协同机制的角度异步运行。在这种情况下,您应该使用withContext()
https://stackoverflow.com/questions/53752991
复制相似问题