gpt4 book ai didi

android - 为什么 kotlin 协程会阻止这段代码?

转载 作者:行者123 更新时间:2023-12-02 12:17:27 24 4
gpt4 key购买 nike

为什么这段代码永远不会打印 Hello World?

runBlocking(Dispatchers.Main) {
launch {
delay(1)
println("Hello world")
}
}

但这会打印

runBlocking {
launch {
delay(1)
println("Hello world")
}
}

最佳答案

据我所见,第一个示例完全卡住了应用程序(在按钮点击监听器中使用时)。

问题是你造成了死锁:

  1. Dispatchers.Main 通过将协程发布(调度)到主应用程序循环器来工作
  2. runBlocking 阻塞主应用程序线程
  3. main looper 永远不会运行发布的协程,因为它正在等待 runBlocking 完成

您可以通过使用 Dispatchers.Main.immediate 来稍微缓解“问题”,它是基础调度程序的更智能版本 - 如果它已经在运行,它不会将协程发布到主循环程序主线程并就地执行它。

这将允许您运行 launch block ,但是 delay 将再次发布协程以继续主循环并导致另一个死锁。

第二个代码示例没有问题,因为在那里运行的协程不与主线程交互(除了 runBlocking it)。

关于android - 为什么 kotlin 协程会阻止这段代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63361989/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com