Kotlin 的启动是在主线程还是后台线程中启动协程?

xjc*_*jcl 3 android jvm coroutine kotlin kotlin-coroutines

我试图在 Android 的后台运行一个任务,我想知道我是否需要指定GlobalScope.launch(Dispatchers.IO) { ... }或者一个简单的GlobalScope.launch { ... }就足够了。我担心的是第二种形式是在主线程还是后台/IO 线程中启动协程?


根据Android 文档

launch不带Dispatchers.IO参数。当您不传递 aDispatcher来启动时,任何从viewModelScope 运行启动的协程都在主线程中运行

根据Kotlin 文档

在 GlobalScope 中启动协程时使用的默认调度程序由 Dispatchers.Default 表示并使用共享的线程后台池,因此launch(Dispatchers.Default) { ... }使用与GlobalScope.launch { ... }.

我知道协程直到最近才处于试验阶段,Android-Kotlin 与纯 Kotlin 开发是不同的,但这些陈述对我来说似乎是矛盾的。

Ani*_*ahu 6

GlobalScopeEmptyCoroutineContext这意味着 Dispatchers.Default 将在其中直接启动时使用。

演示行为的示例:https : //pl.kotl.in/cLy3UfuZO

我担心的是第二种形式是在主线程还是后台/IO 线程中启动协程?

它会将它启动到 Dispatchers.Default 下的 CommonPool 中,它共享与 CPU 中内核数相同的最大线程,例如,如果您的 CPU 有 6 个内核,那么最大限制为 6 个线程。然而,Dispatchers.IO 最多允许从 CommonPool 借用 64 个线程。Dispatchers.Main 是单线程的。


故事viewModelScope是不同的,该范围包含Dispatchers.Main作为其默认调度程序启动。您可以像这样创建一个范围,CoroutineScope(Dispatchers.Main)以便每次不指定调度程序的启动都将在 Main 中启动,类似于viewModelScope.