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吗?作用域与局部变量作用域完全不同?