我试图在Android上的后台运行任务,我想知道是否需要指定GlobalScope.launch(Dispatchers.IO) { ... }
还是简单的GlobalScope.launch { ... }
就足够了。我担心的是第二种形式是在主线程中还是在后台/ IO线程中启动协程 ?
launch
不使用Dispatchers.IO
参数。如果您没有通过Dispatcher
启动,则从viewModelScope
启动的所有协程都会在主线程中运行。
在GlobalScope中启动协程时使用的默认调度程序由Dispatchers表示。Default和使用共享的后台线程池,因此
launch(Dispatchers.Default) { ... }
使用与{{ 1}}。
我知道协程直到最近都是实验性的,Android-Kotlin与纯Kotlin的开发有所不同,但是这些陈述对我来说似乎是矛盾的。
答案 0 :(得分:4)
GlobalScope的EmptyCoroutineContext表示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
。