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

时间:2020-06-25 11:23:18

标签: android kotlin jvm coroutine kotlin-coroutines

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


根据Android documentation

launch不使用Dispatchers.IO参数。如果您没有通过Dispatcher启动,则从viewModelScope启动的所有协程都会在主线程中运行

根据Kotlin documentation

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

我知道协程直到最近都是实验性的,Android-Kotlin与纯Kotlin的开发有所不同,但是这些陈述对我来说似乎是矛盾的。

1 个答案:

答案 0 :(得分:4)

GlobalScopeEmptyCoroutineContext表示Dispatchers。在其中直接启动时将使用默认值。

演示行为的示例: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)范围,以便每次未指定调度程序的启动都将启动类似于viewModelScope