Android Kotlin Coroutine GlobalScope文档清晰度
我很难理解GlobalScope的用法和文档。 文件规定: 不绑定到任何作业的全局协同作用域 全局作用域用于启动顶级协同程序,这些程序是 在整个应用程序生命周期内运行,并且不会被取消 过早地。全局作用域的另一个用途是在 调度员。未约束,没有任何与之相关的作业 应用程序代码通常应使用定义的应用程序 协同观察镜。在GlobalScope实例上使用async或launch 他非常气馁Android Kotlin Coroutine GlobalScope文档清晰度,android,kotlin,kotlin-coroutines,global-scope,Android,Kotlin,Kotlin Coroutines,Global Scope,我很难理解GlobalScope的用法和文档。 文件规定: 不绑定到任何作业的全局协同作用域 全局作用域用于启动顶级协同程序,这些程序是 在整个应用程序生命周期内运行,并且不会被取消 过早地。全局作用域的另一个用途是在 调度员。未约束,没有任何与之相关的作业 应用程序代码通常应使用定义的应用程序 协同观察镜。在GlobalScope实例上使用async或launch 他非常气馁 当GlobalScope不与任何作业绑定时,这意味着什么?因为我能做到 val job = GlobalScope.l
val job = GlobalScope.launch {
// some work
}
job.cancel()
CoroutineScope
相比如何?当我在运行的<代码> CoroutineScope < /COD>中间退出Android <代码>活动<代码>时,它仍然是活着的并运行到完成。这是否仅仅意味着CoroutineScope
完成后将通过垃圾收集得到清理,而GlobalScope
不会
CoroutineScope
关联的Job
对象,而不是“范围”内的单个coroutineJob
s
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()
}
fun main(args:Array){
val myScope:CoroutineScope=对象:CoroutineScope{
override val coroutineContext:coroutineContext=Dispatchers.IO//未添加作业,即+SupervisorJob()
}
val job=myScope.launch{longRunningTask()}
线程。睡眠(5_000)
job.cancel()//这很好-已取消单个协同程序
myScope.cancel()//这将抛出一个错误,与GlobalScope.cancel()相同
}
GlobalScope
是一个对象类,是一个单例,因此只要它在其中运行,它就可以持续GlobalScope
实现了CoroutineScope
它只是库附带的预定义范围。协同路由可以从GlobalScope
启动,但调用者必须注意保留作业
对象,并通过作业
取消每个协同路由。使用自定义CoroutineScope
时,您可以更好地控制调用扩展函数CoroutineScope.cancel()
——例如,取消该范围内所有“正在运行”的子coroutines
我不是这方面的权威,但这就是我解释文档和观察图书馆行为的方式
老实说,我想大多数人都很难简单而简洁地解释协同程序——关于这个主题的大多数文章都不容易阅读,通常我会比较困惑。在对库源代码进行了深入研究后,通常会使事情变得有些僵化,但您也可以看到它仍然处于持续开发的状态