Android Flow 基本概念和使用
一、什么是 Flow?
Flow 是 Kotlin 协程库中的异步数据流处理工具,用于按顺序发射多个值。它类似于 RxJava 的 Observable,但更轻量且与协程深度集成。
二、核心概念
- 生产者:产生数据流
- 中间操作符:处理数据流
- 消费者:接收处理结果
三、基础使用
示例 1:最简单的 Flow
// 在 ViewModel 中
fun simpleFlow(): Flow<Int> = flow {
// 生产者:发射数字 1~3
for (i in 1..3) {
delay(1000) // 模拟耗时操作
emit(i)
}
}
// 在 Activity/Fragment 中
lifecycleScope.launch {
viewModel.simpleFlow().collect { value ->
// 消费者:收集数据
Log.d("FlowDemo", "Received: $value")
}
}
输出结果(每秒输出一个数字):
Received: 1
Received: 2
Received: 3
示例 2:使用操作符
fun processedFlow(): Flow<String> = flow {
for (i in 1..5) {
delay(500)
emit(i)
}
}.map {
// 中间操作:转换为字符串
"Item $it"
}.filter {
// 中间操作:过滤偶数
it.last().toString().toInt() % 2 != 0
}
收集结果:
Item 1
Item 3
Item 5
四、结合 Android 开发
示例 3:模拟网络请求
// ViewModel 中
fun fetchUserData(): Flow<String> = flow {
// 模拟网络请求
delay(2000)
emit("User Data")
// 模拟更新数据
delay(1500)
emit("Updated Data")
}.flowOn(Dispatchers.IO) // 指定在 IO 线程执行
// Activity 中收集
lifecycleScope.launchWhenStarted {
viewModel.fetchUserData()
.onEach { data ->
// 更新 UI
binding.tvData.text = data
}
.catch { e ->
// 异常处理
Toast.makeText(context, "Error: ${e.message}", Toast.LENGTH_SHORT).show()
}
.collect()
}
五、特性说明
一文吃透Kotlin中冷流(Clod Flow)和热流(Hot Flow)
- 冷流:只有当收集者存在时才会执行生产代码
- 上下文控制:使用
flowOn切换上游上下文 - 异常处理:
.catch { e ->
// 捕获上游异常
}
六、添加依赖(build.gradle)
dependencies {
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4"
implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.6.0"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.0"
}
七、实践建议
- 在 ViewModel 中暴露 Flow
- 使用
lifecycleScope或viewModelScope收集数据 - 需要时使用
stateIn/sharedIn转换为热流 - 复杂场景可结合 Room 或 Retrofit 使用
通过以上示例和说明,您已经可以开始使用 Flow 处理简单的异步数据流。建议从简单场景入手,逐步尝试更复杂的操作符组合!