协程进阶:上下文 07. 父子协程的等待机制

本篇解析 example-context-07.kt。探讨父协程如何管理子协程的结束。

1. 核心规则:父协程的责任

父协程总是会等待所有的子协程完成后才结束。

特点:

  • 隐式等待:你不需要显式地对每个子协程调用 join()。父协程会感知到其作用域内所有活跃的 Job。
  • 结构化并发:这种机制确保了在父任务(如一个网络请求流)宣告完成时,它发起的细节任务也已经全部处理完毕。

2. 代码解析

1
2
3
4
5
6
7
8
9
10
val request = launch {
repeat(3) { i ->
launch {
delay((i + 1) * 200L)
println("Coroutine $i is done")
}
}
println("request: I'm done")
}
request.join() // 这行会等待 request 及其所有 3 个子协程全部完成

3. 开发者感悟

这是协程设计中非常优雅的一点。它消除了“孤儿协程”的风险。在 Android 中,如果你在 ViewModel 启动了一个任务,这个任务又分发了几个子任务,你只需要关注顶层任务的状态,底层任务的同步由协程库自动完成。

,