协程进阶:选择 04. 在 Await 上选择 (onAwait)

本篇解析 example-select-04.kt。探讨如何获取一组并发任务中最快返回的那个结果。

1. 核心操作:onAwait

select 可以用于监听 Deferred 对象的完成。

特点:

  • 非阻塞等待:当有多个并发的 async 任务时,谁先返回,就执行谁的 onAwait 代码块。
  • 自动忽略其他:一旦其中一个任务返回并被选中,其余的任务依然在后台运行,但它们的结果在本次 select 中会被忽略。

2. 代码解析

1
2
3
4
5
6
7
8
9
val list = asyncStringsList() // 启动 12 个随机延迟的 async 任务
val result = select<String> {
list.withIndex().forEach { (index, deferred) ->
deferred.onAwait { answer ->
"Deferred $index produced answer '$answer'"
}
}
}
println(result) // 打印第一个产出的结果

3. 开发者感悟

onAwait 配合 select 是处理“多源竞争”的最佳实践。在 Android 中,如果你从缓存(磁盘)和网络同时拉取数据,你可以通过这种方式展示“最快到达”的数据,显著缩短用户的等待感。

,