Android CoroutineScope 完成后自动取消

Sam*_*hen 6 android kotlin kotlin-coroutines android-threading coroutinescope

我想知道coroutineScope工作完成后是否会自动取消。coroutineScope假设我在自定义类中创建一个而不是 ViewModel类或Fragment / Activity类:

class MyClass {
    private val backgroundScope = CoroutineScope(Dispatchers.Default)

    fun doSomething() = backgroundScope.launch {
        //do background work
    }
}
Run Code Online (Sandbox Code Playgroud)

那么,后台工作完成后,会backgroundScope自动取消吗?

小智 5

ACoroutineScope由 组成CoroutineContext。ACoroutineContext由 2 个主要元素组成,aJob和 a ContinuationInterceptor(通常只是 a CoroutineDispatcher),其他元素是CoroutineExceptionHandler和CoroutineName。

如果协程完成,它不会取消作用域(即它的作业)。即使您取消协程的作业,它也不会取消作用域(即它的作业)。因为每次使用特定作用域触发协程时,协程的作业都会成为该作用域作业的子作业。

在您的情况下backgroundScope,您自己没有指定 a Job,如果您深入研究源代码,您会发现在没有 a 的情况下Job,Job提供了一个实例。

val coroutineJob = backgroundScope.launch { ... }
Run Code Online (Sandbox Code Playgroud)

当这个coroutineJob完成或被取消时,它不会取消Job里面的backgroundScope,因此backgroundScope不会被取消。


Ten*_*r04 5

它不会自动取消。它保持开放状态,可以在其上启动任意数量的工作。SupervisorJob()但是,如果您不希望作用域 a 被任何异常完成的子作业杀死,您可能需要将作用域 a作为其根上下文。如果发生这种情况,作用域上的后续协程将不会启动。

private val backgroundScope = CoroutineScope(SupervisorJob())
Run Code Online (Sandbox Code Playgroud)

lifecycleScope当它们的关联类被销毁时和被自动取消的原因viewModelScope是因为在幕后,Jetpack 订阅了关联类的生命周期并手动取消了onDestroy().