Android 什么';合作视野的范围是什么?

Android 什么';合作视野的范围是什么?,android,kotlin,kotlin-coroutines,coroutinescope,Android,Kotlin,Kotlin Coroutines,Coroutinescope,我目前正在学习关于协作的知识。在我的应用程序的onCreate类中,我执行了以下操作: override fun onCreate() { super.onCreate() val job = CoroutineScope(IO).launch { while(true) { Timber.i("hello from coroutine") delay(1000) } }

我目前正在学习关于协作的知识。在我的
应用程序的
onCreate
类中,我执行了以下操作:

override fun onCreate() {
    super.onCreate()

    val job = CoroutineScope(IO).launch {
        while(true) {
            Timber.i("hello from coroutine")
            delay(1000)
        }
    }

    job.invokeOnCompletion {
        Timber.i("job.invokeOnCompletion")
    }
}
我本以为一旦创建
onCreate
完成,作业就会被取消,但它会无休止地运行:

2020-06-28 16:23:11.436 onCreate$job: hello from coroutine
[..]
2020-06-28 16:23:19.489 onCreate$job: hello from coroutine
2020-06-28 16:23:21.504 onCreate$job: hello from coroutine
2020-06-28 16:23:22.512 onCreate$job: hello from coroutine
2020-06-28 16:23:23.516 onCreate$job: hello from coroutine
[..]
2020-06-28 16:23:45.671 onCreate$job: hello from coroutine
  • 那么,
    CoroutineScope
    的范围是什么呢?是否应该在到达onCreate的
    结束时立即取消它
  • 注意作业输出,16:23:19.489和16:23:21.504之间有一个间隙,缺少16:23:20。有人能解释为什么吗
  • 我多次强制垃圾收集,但输出仍在继续。如果
    作业是局部变量,那么它会被垃圾收集吗

  • 如果线程仍在运行,则无法对其进行垃圾回收

    协同程序仍在运行,并且在onCreate()结束时不会取消。如果希望在片段或活动的生命周期被销毁时自动取消,则可以将协同路由附加到该片段或活动的生命周期。但是,onCreate()和函数通常没有生命周期。如果你想达到类似的效果,你必须在你的函数末尾有
    job.cancel()

    因此,要回答您的问题:

  • 不,线程(或协程)不会被任意取消
  • CPU正忙于运行其他任务1秒钟。例如,IO线程没有与UI相同的优先级
  • 你不能强迫GC,你只能建议现在是收集垃圾的好时机。你不应该试图智取GC。而且,没有什么可收集的

  • 直到取消为止。您创建了自己的,但没有被您取消,因此它不知道您打算在onDestroy中取消它。您可以使用
    lifecycleScope
    来为您处理此问题。它不应该被垃圾收集吗,因为
    job
    是一个局部变量吗?
    CoroutineScope
    只是一组coroutines吗?作用域与局部变量作用域完全不同?