android - CoroutineScope的范围是什么?

标签 android kotlin kotlin-coroutines coroutinescope

我目前正在学习协程。在我的onCreate类的Application中,我执行了以下操作:

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 。谁能解释为什么?
  • 我多次强制进行垃圾回收,但输出仍然继续。是否希望job是局部变量,因此会被垃圾回收?
  • 最佳答案

    如果线程仍在运行,则无法对其进行垃圾回收。
    协程仍在运行,并且onCreate()结束时不会被取消。如果要在销毁碎片或 Activity 时自动取消协程,可以将协程附加到碎片或 Activity 的生命周期。但是,onCreate()和函数通常没有生命周期。如果要实现类似的目的,则必须在函数末尾添加job.cancel()
    因此,回答您的问题:

  • 不,线程(或协程)不会被任意取消。
  • CPU忙于运行其他任务1秒钟。例如,IO线程的优先级与UI不同。
  • 您不能强行使用GC,只能提出这是收集垃圾的好时机。您不应该试图超越GC。另外,也没有什么可收集的。
  • 关于android - CoroutineScope的范围是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62623946/

    相关文章:

    android - 具有捕捉效果的 Flutter 水平滚动 gridview

    kotlin - supervisorScope 取消其父级

    Android Kotlin 协程 : await might silently drop exceptions

    java - Android 动态壁纸视差滚动效果

    Android:缩放时确定可视区域的坐标

    java - 更有效地读取按字母顺序排序的文本文件

    java - 为什么实体没有存储在数据库中?

    java - 如何在 Android 中使用对象创建 excel 并通过电子邮件发送

    kotlin - HMS Drive kit 查询和查询字符串

    kotlin - 协程范围构建器流程如何工作