oiy*_*yio 0 android kotlin kotlin-coroutines
在以下代码中,我创建了两个作业,然后取消了父作业。我希望子作业会被取消,但是,子作业不会被取消,它们仍然处于活动状态。为什么?
注意:我知道通过创建 Job() 对象,然后将作业对象提供给协程上下文,然后取消 Job() 对象,可以轻松解决此问题。我的问题是为什么下面的代码不起作用?如果我想取消父作业,是否必须使用显式父参数?
fun main() {
// CoroutineScope
val coroutineScope = CoroutineScope(Dispatchers.IO)
var child1 : Job? = null
var child2 : Job? = null
// Use
val currentJob = coroutineScope.launch {
child1 = coroutineScope.launch {
delay(500)
}
child2 = coroutineScope.launch {
delay(500)
}
}
Thread.sleep(300L)
currentJob.cancel()
println("Job 1 state: ${child1?.status()}")
println("Job 2 state: ${child2?.status()}")
println("Parent job is active: ${coroutineScope.isActive}")
println("Parent job is active: ${currentJob.isActive}")
Thread.sleep(2000L)
}
Run Code Online (Sandbox Code Playgroud)
输出 :
Job 1 state: Active
Job 2 state: Active
Parent job is active: true
Parent job is active: false
Run Code Online (Sandbox Code Playgroud)
child1和child2乔布斯不是currentJob的孩子。他们是coroutineScope约伯的孩子。我们可以说currentJob,child1并且child2是“兄弟姐妹”。如果您想全部取消它们,请coroutineScope改为取消:coroutineScope.cancel()。或者让他们currentJob的孩子并取消currentJob:
val currentJob = coroutineScope.launch {
child1 = launch {
delay(500)
}
child2 = launch {
delay(500)
}
}
Thread.sleep(300L)
currentJob.cancel()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
243 次 |
| 最近记录: |