Android CoroutineScope 完成后自动取消

Posted

技术标签:

【中文标题】Android CoroutineScope 完成后自动取消【英文标题】:Android CoroutineScope Auto Cancel after It Finishes 【发布时间】: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会自动取消吗?

【问题讨论】:

【参考方案1】:

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

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

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

val coroutineJob = backgroundScope.launch  ... 

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

【讨论】:

【参考方案2】:

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

private val backgroundScope = CoroutineScope(SupervisorJob())

lifecycleScopeviewModelScope 在其关联类被销毁时自动取消的原因是,Jetpack 订阅了关联类的生命周期并手动取消了 onDestroy() 中的范围。

【讨论】:

以上是关于Android CoroutineScope 完成后自动取消的主要内容,如果未能解决你的问题,请参考以下文章

Hilt 实战 | 创建应用级别 CoroutineScope

Hilt 实战 | 创建应用级别 CoroutineScope

我一次可以观察多少个 Stateflow?

Kotlin 协程Channel 通道 ③ ( CoroutineScope#produce 构造生产者协程 | CoroutineScope#actor 构造消费者协程 )

Kotlin 协程Channel 通道 ③ ( CoroutineScope#produce 构造生产者协程 | CoroutineScope#actor 构造消费者协程 )

Kotlin 协程Channel 通道 ③ ( CoroutineScope#produce 构造生产者协程 | CoroutineScope#actor 构造消费者协程 )