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】:CoroutineScope
由 CoroutineContext
组成。一个CoroutineContext
由2个主要元素组成,一个Job
和一个ContinuationInterceptor
(通常只是一个CoroutineDispatcher
),其他元素是CoroutineExceptionHandler
和CoroutineName
。
如果协程完成,它不会取消作用域(即它的作业)。 即使您取消协程的作业,它也不会取消作用域(即其作业)。因为每次您使用特定范围触发协程时,协程的作业都会成为该范围作业的子作业。
在您的情况下backgroundScope
,您自己没有指定Job
,如果您深入研究源代码,您会发现在没有Job
的情况下,提供了一个Job
实例。 .
val coroutineJob = backgroundScope.launch ...
当这个coroutineJob
完成或被取消时,它不会取消backgroundScope
内的Job
,因此backgroundScope
不会被取消。
【讨论】:
【参考方案2】:它不会自动取消。它对在其上启动的任意数量的工作保持开放。但是,如果您不希望它被任何异常完成的子作业杀死,您可能希望给范围一个 SupervisorJob()
作为其根上下文。如果发生这种情况,作用域上的后续协程将不会启动。
private val backgroundScope = CoroutineScope(SupervisorJob())
lifecycleScope
和 viewModelScope
在其关联类被销毁时自动取消的原因是,Jetpack 订阅了关联类的生命周期并手动取消了 onDestroy()
中的范围。
【讨论】:
以上是关于Android CoroutineScope 完成后自动取消的主要内容,如果未能解决你的问题,请参考以下文章
Hilt 实战 | 创建应用级别 CoroutineScope
Hilt 实战 | 创建应用级别 CoroutineScope
Kotlin 协程Channel 通道 ③ ( CoroutineScope#produce 构造生产者协程 | CoroutineScope#actor 构造消费者协程 )
Kotlin 协程Channel 通道 ③ ( CoroutineScope#produce 构造生产者协程 | CoroutineScope#actor 构造消费者协程 )
Kotlin 协程Channel 通道 ③ ( CoroutineScope#produce 构造生产者协程 | CoroutineScope#actor 构造消费者协程 )