【问题标题】:Android CoroutineScope Auto Cancel after It FinishesAndroid CoroutineScope 完成后自动取消
【发布时间】:2021-10-18 13:51:49
【问题描述】:
我想知道coroutineScope工作完成后是否会自动取消。假设我在自定义类中创建了一个coroutineScope而不是ViewModel 类或Fragment / Activity 类:
class MyClass {
private val backgroundScope = CoroutineScope(Dispatchers.Default)
fun doSomething() = backgroundScope.launch {
//do background work
}
}
在这种情况下,后台工作完成后,backgroundScope会自动取消吗?
【问题讨论】:
标签:
android
kotlin
kotlin-coroutines
android-threading
coroutinescope
【解决方案1】:
CoroutineScope 由 CoroutineContext 组成。一个CoroutineContext由2个主要元素组成,一个Job和一个ContinuationInterceptor(通常只是一个CoroutineDispatcher),其他元素是CoroutineExceptionHandler和CoroutineName。
如果协程完成,它不会取消作用域(即它的作业)。
即使您取消协程的作业,它也不会取消作用域(即其作业)。因为每次您使用特定范围触发协程时,协程的作业都会成为该范围作业的子作业。
在您的情况下backgroundScope,您自己没有指定Job,如果您深入研究源代码,您会发现在没有Job 的情况下,提供了一个Job 实例。 .
val coroutineJob = backgroundScope.launch { ... }
当这个coroutineJob完成或被取消时,它不会取消backgroundScope内的Job,因此backgroundScope不会被取消。
【解决方案2】:
它不会自动取消。它对在其上启动的任意数量的工作保持开放。但是,如果您不希望它被任何异常完成的子作业杀死,您可能希望给范围一个 SupervisorJob() 作为其根上下文。如果发生这种情况,作用域上的后续协程将不会启动。
private val backgroundScope = CoroutineScope(SupervisorJob())
lifecycleScope 和 viewModelScope 在其关联类被销毁时自动取消的原因是,Jetpack 订阅了关联类的生命周期并手动取消了 onDestroy() 中的范围。