为什么可以在主线程上运行 Kotlin 协程?

2024-02-26

我无法理解why 这段代码 https://medium.com/@trionkidnapper/launching-a-kotlin-coroutine-for-immediate-execution-on-the-main-thread-8555e701163b可以正常工作:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    launch(Dispatchers.Main) {
        log("A")
    }

    log("B")
}

应该输出B首先,然后A.

这行得通吗,因为主线程已经由协程控制了?或者协程 API 是否以某种方式神奇地将代码注入到主线程中?


Android 中的 UI/主线程(以及其他 UI 框架)运行一个所谓的事件循环 https://en.wikipedia.org/wiki/Event_loop。这意味着它等待为其安排任务,它有一个此类任务的队列并按顺序执行它们。例如,当您单击按钮时,在内部onClick操作计划在主线程上运行。但用户也可以手动安排他们的任务,例如使用runOnUiThread() https://developer.android.com/reference/android/app/Activity#runOnUiThread(java.lang.Runnable) or 获取MainLooper() https://developer.android.com/reference/android/os/Looper.html#getMainLooper().

Dispatchers.Main这只是在主线程上安排某些事情的另一种方式。这并不意味着协程完全控制主线程,也不意味着它们以某种方式神奇地向主线程注入任何东西。主线程是协作的,它允许任务和协程的调度只需使用此功能。

另外,您在评论中询问,两个日志语句如何并行运行,但在同一线程上。它们不是并行运行的。onCreate()只有时间表log("A")稍后执行,将其添加到队列中。然后log("B")被调用并且仅当onCreate()完成后,主线程就可以开始执行了log("A")堵塞。所以这实际上是顺序的,但不是按照从上到下的顺序。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么可以在主线程上运行 Kotlin 协程? 的相关文章

随机推荐