我试图在Android上的后台运行任务,并且想知道是否需要指定GlobalScope.launch(Dispatchers.IO) { ... }
一个简单对象GlobalScope.launch { ... }
是否足够。我担心的是第二种形式是在主线程中启动协程还是在后台/ IO线程中启动协程?
根据Android文档,
launch
不带Dispatchers.IO
参数。当您不传递aDispatcher
来启动时,任何协程都会从viewModelScope
run在主线程中启动。
根据Kotlin文档,
在GlobalScope中启动协程时使用的默认调度程序由Dispatchers.Default表示,并使用共享的后台线程池,因此
launch(Dispatchers.Default) { ... }
使用与相同的调度程序GlobalScope.launch { ... }
。
我知道协程直到最近都是实验性的,Android-Kotlin与纯Kotlin的开发有所不同,但是这些陈述对我来说似乎是矛盾的。
GlobalScope具有EmptyCoroutineContext,这意味着Dispatchers.Default将在其中直接启动时使用默认值。
演示行为的示例:https : //pl.kotl.in/cLy3UfuZO
我担心的是第二种形式是在主线程中还是在后台/ IO线程中启动协程?
它将在Dispatchers下将其启动到CommonPool。默认情况下,该线程共享的最大线程数与CPU中的内核数相同,例如,如果您的CPU有6个内核,则最大线程数为6。但是Dispatchers.IO最多允许从CommonPool借用64个线程。Dispatchers.Main是单线程的。
的故事viewModelScope
有所不同,该范围包含Dispatchers.Main
为其默认的启动调度程序。您可以创建一个这样的范围,CoroutineScope(Dispatchers.Main)
以便每次启动而无需指定调度程序将在Main中启动,类似于viewModelScope
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句