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
),其他元素是CoroutineExceptionHandler
和CoroutineName
.
如果协程完成,它不会取消作用域(即它的作业)。
即使您取消协程的工作,它也不会取消作用域(即它的工作)。因为 每次使用特定作用域启动协程时,协程的作业都会成为作用域作业的子作业。
在你的例子 backgroundScope
中,你自己没有指定 Job
,如果你深入研究源代码,你会发现没有 Job
,提供了一个 Job
实例..
val coroutineJob = backgroundScope.launch { ... }
当这个coroutineJob
完成或被取消时,它不会取消backgroundScope
里面的Job
,所以backgroundScope
不会被取消。
它不会自动取消。它保持开放状态,可以在其上启动任意数量的作业。但是,如果您不希望它被任何异常完成的子作业杀死,您可能希望将范围 SupervisorJob()
作为其根上下文。如果发生这种情况,作用域上的后续协程将不会启动。
private val backgroundScope = CoroutineScope(SupervisorJob())
lifecycleScope
和 viewModelScope
在其关联的 class 被销毁时自动取消的原因是因为在幕后,Jetpack 订阅了关联的 class 的生命周期并手动取消 onDestroy()
.
中的范围
我想知道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
),其他元素是CoroutineExceptionHandler
和CoroutineName
.
如果协程完成,它不会取消作用域(即它的作业)。 即使您取消协程的工作,它也不会取消作用域(即它的工作)。因为 每次使用特定作用域启动协程时,协程的作业都会成为作用域作业的子作业。
在你的例子 backgroundScope
中,你自己没有指定 Job
,如果你深入研究源代码,你会发现没有 Job
,提供了一个 Job
实例..
val coroutineJob = backgroundScope.launch { ... }
当这个coroutineJob
完成或被取消时,它不会取消backgroundScope
里面的Job
,所以backgroundScope
不会被取消。
它不会自动取消。它保持开放状态,可以在其上启动任意数量的作业。但是,如果您不希望它被任何异常完成的子作业杀死,您可能希望将范围 SupervisorJob()
作为其根上下文。如果发生这种情况,作用域上的后续协程将不会启动。
private val backgroundScope = CoroutineScope(SupervisorJob())
lifecycleScope
和 viewModelScope
在其关联的 class 被销毁时自动取消的原因是因为在幕后,Jetpack 订阅了关联的 class 的生命周期并手动取消 onDestroy()
.