本篇解析 example-select-02.kt。探讨在选择过程中如何优雅地处理通道关闭。
1. 核心操作:onReceiveCatching
当通道可能被关闭时,普通的 onReceive 在接收到关闭信号时会抛出异常。onReceiveCatching 则会返回一个 ChannelResult。
优势:
- 异常安全:它不会抛出异常。
- 状态判断:你可以通过
isSuccess或getOrNull()来判断是拿到了真实数据,还是通道已经关闭。
2. 代码解析
1 | select<String> { |
3. 开发者感悟
在处理诸如“多源下载”的任务时,有些下载流可能先结束并关闭。使用 onReceiveCatching 能够让你在不崩溃的情况下,从容地处理掉这些已经关闭的资源,并继续监听其他仍在运行的流。