协程进阶:监督 01. SupervisorJob

本篇解析 example-supervision-01.kt。探讨如何打破常规的异常取消联动。

1. 核心概念:SupervisorJob

默认情况下,子协程失败会导致父协程及所有兄弟协程被取消。使用 SupervisorJob 可以改变这一行为。

特点:

  • 单向取消:父协程取消会触发子协程取消,但子协程失败不会导致父协程及其它兄弟协程取消
  • 责任自负:每个子协程必须自己处理自己的异常(通过 try-catchCoroutineExceptionHandler)。

2. 代码解析

1
2
3
4
5
val supervisor = SupervisorJob()
with(CoroutineScope(coroutineContext + supervisor)) {
val firstChild = launch { throw AssertionError() } // 第一个失败
val secondChild = launch { /* ... */ } // 第二个依然存活
}
  • 执行逻辑:即便第一个子协程崩溃了,第二个子协程依然在运行,不受任何影响。

3. 开发者感悟

SupervisorJob 是构建鲁棒系统的关键。在 Android 中,如果你有一个界面展示多个独立板块(如天气、新闻、广告),某个板块的数据加载失败不应该导致整个界面崩溃或停止更新。这就是“监督”机制的价值所在。

,