【问题标题】: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】:

    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() 中的范围。

      【讨论】:

        猜你喜欢
        • 2021-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-21
        • 1970-01-01
        • 2013-01-08
        • 1970-01-01
        相关资源
        最近更新 更多