首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >等待阻止android上的UI线程吗?

等待阻止android上的UI线程吗?
EN

Stack Overflow用户
提问于 2018-12-12 23:34:53
回答 1查看 1.7K关注 0票数 2

我一直在讨论协同机制,我想知道下面的代码。我在我的onCreate()上有以下操作。

代码语言:javascript
复制
asyncJob = GlobalScope.launch(Dispatchers.Main) {
    val name = async(Dispatchers.Default) { queryDevices() }.await()
    mDeviceName.text = deviceName
}

打印出来后,执行的顺序似乎是在UI线程上的" name“之前,在设置了名称之后,它也出现在UI线程上。queryDevicesMethod()正处于预期的后台线程中。

但是我想知道,当在UI线程上调用它时,实际上在做什么?它是否阻塞theUI线程直到等待返回?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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的完成。

顺便说一句:您不应该在一条语句中使用asyncawait。这没什么意义。您真正想要的是从另一个调度程序运行queryDevices()-function,而不是从协同机制的角度异步运行。在这种情况下,您应该使用withContext()

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53752991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档