3

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

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

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

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

4

2 回答 2

2

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

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

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

val coroutineJob = backgroundScope.launch { ... }

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

于 2021-08-16T14:50:01.810 回答
1

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

private val backgroundScope = CoroutineScope(SupervisorJob())

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

于 2021-08-16T14:52:01.207 回答