【问题标题】:Coroutine combined Job is not completed协程组合作业未完成
【发布时间】:2020-09-22 21:02:46
【问题描述】:

从启动获取作业时,作业正确完成

fun testCoroutineScope() = runBlocking {
    val scope = CoroutineScope(Dispatchers.Default)
    val job = scope.launch {
        delay(200)
        println("Job done")
    }
    delay(500)
    println(job.isCompleted)
}

输出:

Job done
true

但当你合并自己的工作时,情况并非如此。

fun testCoroutineScope() = runBlocking {
        var job = Job()
        val scope = CoroutineScope(Dispatchers.Default + job)
        scope.launch {
            delay(200)
            println("Job done")
        }
        delay(500)
        println(job.isCompleted)
}

输出:

Job done
false

看起来这项工作从未完成。这是为什么呢?

【问题讨论】:

    标签: android kotlin coroutine


    【解决方案1】:

    scope.launch 创建一个新作业。当您执行Dispatchers.Default + job 时,您并没有将您的工作传递给范围。您正在创建一个新的CoroutineContext,它结合了jobDispatchers.Default 的元素。文字作业对象本身不会传递给新的上下文。

    【讨论】:

    • 但是为什么作业没有完成呢?我仍然可以通过传递作业取消,这意味着他们有某种联系,但为什么它仍然处于活动状态?
    • 它是另一个 Job 的父 Job。它不完整,因为您仍然可以向其中添加更多孩子。
    • 那么这是否意味着,在我的示例中,如果我不故意取消父作业,它将永远不会完成/取消?
    • @PandaWorld 是的,它仍然处于活动状态。如果你想手动完成一项工作,它应该是 CompletableJob 的实现,然后你调用 complete() 就可以了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-29
    • 2013-02-24
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 2020-02-03
    相关资源
    最近更新 更多