![](/img/trans.png)
[英]Code inside Kotlin's GlobalScope (Coroutine) is not working properly
[英]Kotlin Coroutine GlobalScope documentation clarity
我很难理解 GlobalScope 的用法和文档。 文档指出:
未绑定到任何作业的全局 CoroutineScope。
全局 scope 用于启动在整个应用程序生命周期内运行且不会提前取消的顶级协程。 全局 scope 的另一个用途是在 Dispatchers.Unconfined 中运行的算子,它没有任何与之关联的作业。
应用程序代码通常应该使用应用程序定义的 CoroutineScope。 强烈建议不要在 GlobalScope 的实例上使用异步或启动。
GlobalScope 不受任何工作的约束是什么意思? 因为我可以
val job = GlobalScope.launch { // some work } job.cancel()
它说它们不会过早取消。 这是什么意思? 正如你在上面看到的,我可以取消它。
最后它说,它在整个应用程序生命周期中运行。 所以 scope 在应用程序终止之前一直保持活动状态。 这与CoroutineScope
相比如何? 当我在正在运行的CoroutineScope
中间退出 Android Activity
时,它仍然处于活动状态并运行直到完成。 这是否只是意味着CoroutineScope
将在完成后通过垃圾收集进行清理而GlobalScope
不会?
- GlobalScope 不受任何工作的约束是什么意思? 因为我可以做...
这是指缺少与 CoroutineScope 关联的Job
CoroutineScope
,而不是“范围”内的单个协程Job
。
- 它说它们不会过早取消。 这是什么意思? 正如你在上面看到的,我可以取消它。
在任何时候调用GlobalScope.cancel()
都会抛出IllegalArgumentException
。
所以这会产生同样的错误:
fun main(args: Array<String>) {
val myScope : CoroutineScope = object : CoroutineScope {
override val coroutineContext: CoroutineContext = Dispatchers.IO // no job added i.e + SupervisorJob()
}
val job = myScope.launch { longRunningTask() }
Thread.sleep(5_000)
job.cancel() // this is fine - individual coroutine cancelled
myScope.cancel() // this will throw an error, same as GlobalScope.cancel()
}
- 最后它说,它在整个应用程序生命周期中运行。 所以 scope 在应用程序终止之前一直保持活动状态。 这与 CoroutineScope 相比如何? 当我在正在运行的 CoroutineScope 中间退出 Android Activity 时,它仍然处于活动状态并运行直到完成。 这是否只是意味着 CoroutineScope 将在完成后通过垃圾收集进行清理而 GlobalScope 不会?
GlobalScope
is an object class - a singleton, thus lasts as long as the process it runs in. GlobalScope
implements CoroutineScope
its just a predefined scope that comes with the library. 协程可以从GlobalScope
启动,但调用者必须注意保留Job
object 并通过Job
取消每个协程。 使用自定义CoroutineScope
时,您可以更好地控制调用扩展 function CoroutineScope.cancel()
时发生的情况 - 例如取消在 scope 中“运行”的所有子协程。
我对这个主题没有权威,但这就是我解释文档和观察图书馆行为的方式。
老实说,我认为大多数人都难以简单明了地解释协程 - 大多数关于该主题的文章都不容易阅读,而且通常我会更加困惑。 在深入研究库源代码之后,它通常会消除一些东西,但您也可以看到它仍然非常处于持续开发的 state 中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.