Android CoroutineScope 完成后自动取消

Android CoroutineScope Auto Cancel after It Finishes

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

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

    fun doSomething() = backgroundScope.launch {
        //do background work
    }
}

在这种情况下,后台工作完成后,backgroundScope会自动取消吗?

一个CoroutineScope由一个CoroutineContext组成。一个CoroutineContext由2个主要元素组成,一个Job和一个ContinuationInterceptor(通常只是一个CoroutineDispatcher),其他元素是CoroutineExceptionHandlerCoroutineName .

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

在你的例子 backgroundScope 中,你自己没有指定 Job,如果你深入研究源代码,你会发现没有 Job,提供了一个 Job 实例..

val coroutineJob = backgroundScope.launch { ... }

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

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

private val backgroundScope = CoroutineScope(SupervisorJob())

lifecycleScopeviewModelScope 在其关联的 class 被销毁时自动取消的原因是因为在幕后,Jetpack 订阅了关联的 class 的生命周期并手动取消 onDestroy().

中的范围