【发布时间】: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
- 那么
CoroutineScope的范围是什么?不应该一到onCreate的结尾就取消吗? - 注意作业输出,16:23:19.489 和 16:23:21 之间存在差距。 504,缺少 16:23:20。谁能解释一下原因?
- 我多次强制垃圾回收,但输出仍在继续。会期望
job被垃圾收集,因为它是一个局部变量?
【问题讨论】:
-
直到它被取消。您创建了自己的并没有被您取消,因此它不知道您打算在 onDestroy 中取消它。您可以使用
lifecycleScope代替它为您处理此问题。 -
不应该被垃圾回收,因为
job是一个局部变量吗? -
是
CoroutineScope只是一组协程?作用域与局部变量作用域完全不同?
标签: android kotlin kotlin-coroutines coroutinescope