gpt4 book ai didi

android - CoroutineScope的范围是什么?

转载 作者:行者123 更新时间:2023-12-02 12:56:09 25 4
gpt4 key购买 nike

我目前正在学习协程。在我的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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com