【问题标题】:What's the scope of a CoroutineScope?CoroutineScope 的范围是什么?
【发布时间】:2020-10-18 18:42:12
【问题描述】:

我目前正在学习协程。在我的Application 班级的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
  1. 那么CoroutineScope的范围是什么?不应该一到onCreate的结尾就取消吗?
  2. 注意作业输出,16:23:19.48916:23:21 之间存在差距。 504,缺少 16:23:20。谁能解释一下原因?
  3. 我多次强制垃圾回收,但输出仍在继续。会期望 job 被垃圾收集,因为它是一个局部变量?

【问题讨论】:

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

标签: android kotlin kotlin-coroutines coroutinescope


【解决方案1】:

如果线程仍在运行,则不能对其进行垃圾回收。

协程仍在运行,不会在 onCreate() 结束时取消。如果您想在片段被销毁时自动取消,您可以将协程附加到片段或活动的生命周期。但是,onCreate() 和函数通常没有生命周期。如果你想实现类似的东西,你必须在你的函数末尾有job.cancel()

所以回答你的问题:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 2017-04-22
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多