协程进阶:选择 01. Select 表达式基础

本篇解析 example-select-01.kt。探讨如何同时等待多个异步挂起函数。

1. 核心概念:select

select 表达式允许你同时等待多个挂起函数,并只响应第一个完成的任务。

特点:

  • 多路复用:它可以同时监听多个 Channel
  • 偏好机制:如果多个子句同时准备就绪,select 通常会优先选择第一个。

2. 代码解析 (FizzBuzz 案例)

两个生产者分别以 500ms (fizz) 和 1000ms (buzz) 的频率产出数据。

1
2
3
4
select<Unit> { 
fizz.onReceive { value -> println("fizz -> '$value'") }
buzz.onReceive { value -> println("buzz -> '$value'") }
}
  • 执行逻辑:无论哪个通道先发来消息,select 都会立即执行对应的代码块并结束本次选择。

3. 开发者感悟

select 就像是赛跑的裁判,谁先过终点线就判定谁赢,并立即结束比赛。在 Android 中,如果你从两个不同的服务器请求同一个数据,你可以用 select 来取最先返回的那个,从而提升用户体验。

,