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 开发是不同的,但这些陈述对我来说似乎是矛盾的。
GlobalScope有EmptyCoroutineContext这意味着 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.
| 归档时间: |
|
| 查看次数: |
788 次 |
| 最近记录: |