我试着理解在这种情况下父母和孩子的关系是如何运作的。
private fun coroutineTest() {
val job = CoroutineScope(Dispatchers.IO).launch {
val standAloneJob = Job(coroutineContext.job)//this will create the relationship parent - child
launch(standAloneJob) {
delay(2000)
Log.d(TAG,"I'm here")
}
delay(4000)
if(standAloneJob.isCompleted) { // always false
Log.d(TAG,"isCompleted")
}
//standAloneJob.complete() // without this line method invokeOnCompletion never called
}
job.invokeOnCompletion {
Log.d(TAG,"invokeOnCompletion")
}
}问题是,为什么standAloneJob初始化的子协同没有完成,因此父协同也没有完成?
发布于 2022-05-18 10:10:03
为了建立父子关系,您不需要手动创建作业。默认情况下,当使用launch { .. }而不覆盖其任务时,就会这样做。
如果你真的像这样创造了你自己的工作,那么你就有责任去完成它。
在这里,standAloneJob只充当嵌套launch的父级任务,而不是启动的任务:
val job = GlobalScope.launch {
val standAloneJob = Job(coroutineContext.job)//this will create the relationship parent - child
val child = launch(standAloneJob) {
...
}
println(child == standAloneJob) // false
println(child in standAloneJob.children) // true
...
}当嵌套launch完成时,它的关联作业也会完成,但它不会自动完成其父standAloneJob,因此也不会完成它的祖父母coroutineContext.job。
https://stackoverflow.com/questions/72287023
复制相似问题