Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Kotlin Coroutine GlobalScope文档清晰度_Android_Kotlin_Kotlin Coroutines_Global Scope - Fatal编程技术网

Android Kotlin Coroutine GlobalScope文档清晰度

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

我很难理解GlobalScope的用法和文档。 文件规定:

不绑定到任何作业的全局协同作用域

全局作用域用于启动顶级协同程序,这些程序是 在整个应用程序生命周期内运行,并且不会被取消 过早地。全局作用域的另一个用途是在 调度员。未约束,没有任何与之相关的作业

应用程序代码通常应使用定义的应用程序 协同观察镜。在GlobalScope实例上使用async或launch 他非常气馁

  • 当GlobalScope不与任何作业绑定时,这意味着什么?因为我能做到

    val job = GlobalScope.launch {
        // some work
    }
    job.cancel() 
    
  • 它说,它们不会过早取消。这是什么意思?正如你在上面看到的,我可以取消它

  • 最后它说,它在整个应用程序生命周期中运行。因此,作用域将一直保持活动状态,直到应用程序死亡。这与
    CoroutineScope
    相比如何?当我在运行的<代码> CoroutineScope < /COD>中间退出Android <代码>活动<代码>时,它仍然是活着的并运行到完成。这是否仅仅意味着
    CoroutineScope
    完成后将通过垃圾收集得到清理,而
    GlobalScope
    不会

  • 链接到文档:

  • 当GlobalScope不与任何作业绑定时,这意味着什么?因为我可以
  • 这是指缺少与
    CoroutineScope
    关联的
    Job
    对象,而不是“范围”内的单个coroutine
    Job
    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()相同
    }
    
  • 最后它说,它在整个应用程序生命周期中运行。因此,作用域将一直保持活动状态,直到应用程序死亡。这与CoroutineScope相比如何?当我在运行的CoroutineScope中间退出Android活动时,它仍然是活动的,直到完成为止。这是否仅仅意味着CoroutineScope将在完成后通过垃圾收集得到清理,而GlobalScope不会
  • GlobalScope
    是一个对象类,是一个单例,因此只要它在其中运行,它就可以持续
    GlobalScope
    实现了
    CoroutineScope
    它只是库附带的预定义范围。协同路由可以从
    GlobalScope
    启动,但调用者必须注意保留
    作业
    对象,并通过
    作业
    取消每个协同路由。使用自定义
    CoroutineScope
    时,您可以更好地控制调用扩展函数
    CoroutineScope.cancel()
    ——例如,取消该范围内所有“正在运行”的子coroutines

    我不是这方面的权威,但这就是我解释文档和观察图书馆行为的方式

    老实说,我想大多数人都很难简单而简洁地解释协同程序——关于这个主题的大多数文章都不容易阅读,通常我会比较困惑。在对库源代码进行了深入研究后,通常会使事情变得有些僵化,但您也可以看到它仍然处于持续开发的状态