android - 在不使用显式 Job() 对象的情况下取消父作业
问题描述
在下面的代码中,我创建了两个作业,然后我取消了父作业。我希望子作业会被取消,但是,子作业不会被取消,它们仍然处于活动状态。为什么?
注意:我知道这个问题可以通过创建一个 Job() 对象来轻松解决,然后将 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)
}
输出 :
Job 1 state: Active
Job 2 state: Active
Parent job is active: true
Parent job is active: false
解决方案
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()
推荐阅读
- android - 将商品添加到购物车列表
- unity3d - 在 3D Arcore 中转换场景中的 2D 对象
- airflow - 添加第一个 dag 时出现 Cloud Composer 调度程序错误
- c# - Web 应用程序中一个 access_token 的多个用户
- jquery - 基于jquery过滤项目
- shader - HLSL 整数纹理坐标
- apache-kafka - 使用 Kafka Spout 的 Apache Storm 出现错误:IllegalStateException
- python - 如何在控制台中运行没有复制源的单元格?
- gwt - GWT Bootstrap 预输入事件监听器?
- mysql - 为什么我的 SQL 语句有时没有返回结果?