Android Flow 零基础到入门教程———基本概念和使用

1,369 阅读2分钟

Android Flow 基本概念和使用

一、什么是 Flow?

Flow 是 Kotlin 协程库中的异步数据流处理工具,用于按顺序发射多个值。它类似于 RxJava 的 Observable,但更轻量且与协程深度集成。

二、核心概念

  1. 生产者:产生数据流
  2. 中间操作符:处理数据流
  3. 消费者:接收处理结果

三、基础使用

示例 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)

  1. 冷流:只有当收集者存在时才会执行生产代码
  2. 上下文控制:使用 flowOn 切换上游上下文
  3. 异常处理
.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"
}

七、实践建议

  1. 在 ViewModel 中暴露 Flow
  2. 使用 lifecycleScope 或 viewModelScope 收集数据
  3. 需要时使用 stateIn/sharedIn 转换为热流
  4. 复杂场景可结合 Room 或 Retrofit 使用

通过以上示例和说明,您已经可以开始使用 Flow 处理简单的异步数据流。建议从简单场景入手,逐步尝试更复杂的操作符组合!

更多分享

  1. Android Flow 零基础到入门教程———操作符详解!
  2. Android Flow + ViewModel 最佳实践教程
  3. 一文吃透Kotlin中冷流(Clod Flow)和热流(Hot Flow)