【发布时间】:2020-10-15 20:11:56
【问题描述】:
我正在尝试在 Android 的后台运行任务,我想知道是否需要指定 GlobalScope.launch(Dispatchers.IO) { ... } 或者一个简单的 GlobalScope.launch { ... } 是否足够。我担心的是第二种形式是在主线程还是后台/IO线程中启动协程?
launch不采用Dispatchers.IO参数。当您不传递Dispatcher来启动时,任何从viewModelScope启动的协程在主线程中运行。
在 GlobalScope 中启动协程时使用的默认调度程序由 Dispatchers.Default 表示,并且使用共享后台线程池,因此
launch(Dispatchers.Default) { ... }使用与GlobalScope.launch { ... }相同的调度程序。
我知道协程直到最近还是实验性的,Android-Kotlin 与纯 Kotlin 开发是不同的,但这些陈述对我来说似乎是矛盾的。
【问题讨论】:
-
实际上 viewModelScope 与 GlobalScope 不同,这意味着 viewModelScope.launch 可能与 GlobalScope.launch 可以在不同的调度程序中运行
-
GlobalScope 有 EmptyCoroutineContext 这意味着在其中直接启动时将使用 Dispatchers.Default。
标签: android kotlin jvm coroutine kotlin-coroutines