目录
什么是协程Flow?
在Kotlin协程世界中,Flow是一个非常重要的概念。简单来说,Flow就是协程版本的异步数据流。 它可以顺序地发射多个值,同时保持与协程相同的结构化并发特性。
让我们通过一个简单的例子来理解Flow:
fun simpleFlow(): Flow<Int> = flow {
for (i in 1..3) {
delay(100) // 模拟异步操作
emit(i) // 发射值
}
}
// 收集Flow
suspend fun main() {
simpleFlow().collect {
value ->
println(value)
}
}
// 输出:1, 2, 3(每隔100ms)
Flow的核心特性
1. 冷流(Cold Stream)特性
默认情况下,Flow都是冷流, 这意味着:
-
只有在收集者开始收集时,数据才会开始发射
-
每个收集者都会获得独立的数据流
-
类似于播放列表 - 每次有人收听时都从头开始播放
fun coldFlowExample(): Flow<Int> = flow {
println("Flow开始执行")
for (i in 1..3) {
emit(i)
}
}
suspend fun main() {
val coldFlow = coldFlowExample()
// 第一次收集
coldFlow.collect {
println("第一个收集者: $it") }
// 第二次收集 - 会重新执行flow构建器
coldFlow.collect {
println("第二个收集者: $it") }
}
// 输出:
// Flow开始执行
// 第一个收集者: 1
// 第一个收集者: 2
// 第一个收集者: 3
// Flow开始执行
// 第二个收集者: 1
// 第二个收集者: 2
// 第二个收集者: 3
2. 热流(Hot Stream)特性
热流与冷流相反,它具有以下特点:
-
数据发射独立于收集者的存在
-
多个收集者共享同一个数据源
-
类似于电台广播 - 无论是否有人收听,广播都在进行
Flow的冷流与热流详解
冷流(Cold Stream)
特点:
-
按需创建:只有被收集时才启动
-
独立执行:每个收集者触发独立的执行流程
-
无共享状态:不同收集者获得的数据互不影响
// 冷流示例
fun userDataFlow(userId: String): Flow<User> = flow {
println("从网络获取用户数据: $userId")
val user = api.fetchUser(userId) // 模拟网络请求
emit(user)
}
// 使用
suspend fun main() {
val userFlow

最低0.47元/天 解锁文章
991

被折叠的 条评论
为什么被折叠?



