代码之家  ›  专栏  ›  技术社区  ›  me.at.coding

协作范围是什么?

  •  1
  • me.at.coding  · 技术社区  · 4 年前

    我目前正在学习协作。在里面 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")
        }
    }
    

    我本以为这项工作会被取消一次 创建时的回调函数 完成了,但它却无休止地运行:

    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 ? 难道不应该在年底就取消吗 是否达到?
    2. 注意作业输出,在 16:23: 19 .489 16:23: 21 .504 丢失的 16:23: 20 . 有人能解释为什么吗?
    3. 我多次强制垃圾收集,但输出仍在继续。会预料到 job 作为局部变量进行垃圾收集?
    0 回复  |  直到 4 年前
        1
  •  0
  •   rtsketo    4 年前

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

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

    因此,要回答您的问题:

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