协程工作永远不会完成

时间:2019-02-18 18:59:49

标签: kotlin kotlinx.coroutines

给出这段代码


fun main() {
    val job = Job()
    val scope = GlobalScope + job

    scope.launch {
        println("working!")
        delay(1000L)is ms)
        println("done!")
        // how do i finish the job originally associated with this scope?
    }


    runBlocking {
        job.join()
        println("job done")
    }
}

我有一个针对我的应用程序的自定义协程范围,并且我正在将一个作业与此范围相关联,原因是我希望从该范围创建的所有新协程成为该作业的子级,如果我取消它,我希望其中的所有内容都被取消。

但是主要工作本身从未完成。任务完成后如何完成主要工作?或失败...

2 个答案:

答案 0 :(得分:1)

有几个函数可以等待Job()对象完成并取消它。您可以从列表中选择一个

job.cancel()
job.join()
job.cancelAndJoin()

只有第一个函数不是suspend函数,因此您可以从其他每个函数调用它,而不必是suspend函数

有一个更好的方法-launch{..}函数已经从调用中返回Job对象。您可以将代码简化为

val job = GlobalScope.launch { .. }

启动块结束或发生异常失败时,Job对象将自动完成

答案 1 :(得分:1)

主要工作仅作为父工作,并且永远不会完成。 但是您可以等待所有孩子完成:

runBlocking {
    job.children.forEach { it.join() }
    println("job done")
}

或者,您应该使用Eugene的解决方案,并调用刚开始的join的{​​{1}}方法,而不是主要工作。