协程进阶:监督 02. supervisorScope 作用域

本篇解析 example-supervision-02.kt。学习如何在局部代码块中应用监督机制。

1. 核心概念:supervisorScope

supervisorScope 是一个作用域构建器,它会创建一个使用 SupervisorJob 的作用域。

特点:

  • 局部隔离:它只作用于该块内部的子协程。
  • 子任务独立性:如果块内的一个子任务失败了,它不会导致该作用域内的其他子任务被取消。
  • 父级取消依然有效:如果 supervisorScope 所在的外部协程被取消,或者 supervisorScope 内部的代码抛出了异常,所有子协程依然会被取消。

2. 代码解析

1
2
3
4
5
6
7
8
9
10
11
12
try {
supervisorScope {
val child = launch {
// ... 正在运行的子协程
}
yield()
println("Throwing an exception from the scope")
throw AssertionError() // 作用域自身抛出异常
}
} catch(e: AssertionError) {
println("Caught an assertion error") // 子协程会被取消,因为作用域本身报错了
}

3. 开发者感悟

supervisorScopecoroutineScope 的“监督版”。在 Android 开发中,当你需要在一个挂起函数内部并行处理多项不相关的任务(如同时下载 3 张图片),且希望某一张下载失败不要影响其他的下载时,请务必使用 supervisorScope

,