![](/img/trans.png)
[英]How to show “@coroutine#2”,“@coroutine#3”,“@coroutine#1” in kotlin coroutine?
[英]Kotlin coroutine
我试图了解在这种情况下亲子关系是如何运作的
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初始化的子协程从未完成,因此父协程也没有完成?
您无需手动创建作业即可设置父子关系。 默认情况下,它在使用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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.