本篇解析 example-channel-01.kt。探讨协程间如何进行异步通信。
1. 核心概念:什么是 Channel?
Channel 在概念上类似于 BlockingQueue。它允许一个协程向其中发送数据,另一个协程从中接收数据。
与队列的区别:
- 非阻塞挂起:不同于队列的阻塞(Blocking),Channel 的操作是挂起(Suspending)的。当通道满时,
send会挂起;当通道空时,receive会挂起。
2. 核心参数:容量 (Capacity)
- **RENDEZVOUS (默认)**:会合通道(容量为 0)。发送者和接收者必须“手拉手”才能完成传递。如果没人收,发送者就挂起。
- UNLIMITED:无限容量。发送者永远不挂起。
- BUFFERED:缓冲通道。默认容量为 64,满时挂起。
- CONFLATED:合并通道。只保留最新值,旧值被覆盖,发送者永不挂起。
3. 开发者感悟
Channel 是实现“通过通信来共享内存”理念的核心。在 Android 中,如果你有一个后台任务在不断产出数据(如下载进度),而 UI 层需要异步接收,Channel 是非常稳健的选择。