协程进阶:选择 02. 处理通道关闭 (onReceiveCatching)

本篇解析 example-select-02.kt。探讨在选择过程中如何优雅地处理通道关闭。

1. 核心操作:onReceiveCatching

当通道可能被关闭时,普通的 onReceive 在接收到关闭信号时会抛出异常。onReceiveCatching 则会返回一个 ChannelResult

优势:

  • 异常安全:它不会抛出异常。
  • 状态判断:你可以通过 isSuccessgetOrNull() 来判断是拿到了真实数据,还是通道已经关闭。

2. 代码解析

1
2
3
4
5
6
7
select<String> {
a.onReceiveCatching { it ->
val value = it.getOrNull()
if (value != null) "a -> '$value'" else "Channel 'a' is closed"
}
// ...
}

3. 开发者感悟

在处理诸如“多源下载”的任务时,有些下载流可能先结束并关闭。使用 onReceiveCatching 能够让你在不崩溃的情况下,从容地处理掉这些已经关闭的资源,并继续监听其他仍在运行的流。

,