繁体   English   中英

Kotlin 协程

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM