gpt4 book ai didi

android - CoroutineScope(job+Dispatchers.Main) 如何在主/UI 线程上运行?

转载 作者:行者123 更新时间:2023-12-03 14:23:22 34 4
gpt4 key购买 nike

如果CoroutineScope(job+Dispatchers.Main){...}里面的操作在主线程上运行,那么它为什么不违反 Android 的要求,即不允许在主/UI 线程上运行慢速(阻塞)操作(网络等)?我可以在这个范围内运行阻塞操作,并且 UI 根本不会卡住。

如果有人能解释幕后发生的事情,我将不胜感激。我的猜测是它类似于 JavaScript 如何使用事件循环管理阻塞操作,但我很难找到任何相关 Material 。

最佳答案

My guess is that it is similar to how JavaScript manages blocking operations with the event loop



是的,这是正确的,事件循环对于使协程工作至关重要。基本上,当你写这个时:
uiScope.launch {
delay(1000)
println("A second has passed")
}

它编译成与此具有相同效果的代码:
Handler(Looper.mainLooper()).postDelayed(1000) { println("A second has passed") }

主要概念是延续,一个实现状态机的对象,该状态机对应于您在可挂起函数中编写的顺序代码。当您调用 delay或任何其他可挂起函数,延续的入口点方法返回一个特殊的 COROUTINE_SUSPENDED值(value)。稍后,当一些外部代码出现可挂起函数的返回值时,它必须调用 continuation.resume(result)。 .此调用将被负责的调度程序截获,它将将此调用作为一个事件发布到 GUI 事件循环上。当事件处理程序出列并执行时,您将回到状态机内部,该状态机确定在哪里恢复执行。

您可以查看 this answer有关使用 Continuation 的更充实的示例API。

关于android - CoroutineScope(job+Dispatchers.Main) 如何在主/UI 线程上运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60273519/

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