移动开发

Kotlin 协程 Flow Api 中的冷流和热流

当然!“冷流”和“热流” 是在使用 Kotlin 协程 Flow 系列 API 时非常核心的两个概念,它们影响你如何获取数据、何时开始、是否会重复执行等。


🔥 热流(Hot Flow)

✅ 定义:

热流(Hot Flow)始终在发出数据,无论有没有观察者(订阅者)在监听。


✅ 特点:

特性描述
独立于观察者数据源一直在工作,即使没有人收集
不会重新触发新观察者只能接收到当前或未来的数据,无法看到过去的发射
常见类型StateFlow, SharedFlow, Channel, LiveData

✅ 示例:StateFlow

val stateFlow = MutableStateFlow(0)

stateFlow.value = 1
stateFlow.value = 2

lifecycleScope.launch {
    stateFlow.collect {
        println("收到:$it") // 收到的是 2
    }
}

✅ 即便你 collect 比较晚了,也能马上收到“当前状态”。


❄️ 冷流(Cold Flow)

✅ 定义:

冷流(Cold Flow)只有在被收集(collect)时才开始发射数据,每次 collect 都会重新执行流的逻辑。


✅ 特点:

特性描述
惰性启动没有订阅者时不做任何事情
每次 collect 都重新执行像函数一样,有输入就有执行
适合一次性任务比如网络请求、数据库查询
常见类型Flow(默认就是冷流)

✅ 示例:普通 Flow

val flow = flow {
    println("flow 被触发")
    emit("Hello")
}

lifecycleScope.launch {
    flow.collect {
        println("收到:$it")
    }
}

输出:

flow 被触发
收到:Hello

✅ 每次 collect,都会重新执行 flow { … } 里的内容。


🔍 热流 vs 冷流:对比表

特性冷流 (Flow)热流 (StateFlow, SharedFlow)
是否立即开始❌ 否,collect 才开始✅ 是,创建后就开始发射
多次收集是否重新执行✅ 是❌ 否,只能拿到最新值(StateFlow)或事件(SharedFlow)
是否保留最新值❌ 否✅ 是(StateFlow)
适合做什么网络请求、DB、一次性任务UI 状态、事件通知
是否支持生命周期感知❌ 不自动支持❌ 不自动支持(但可结合 repeatOnLifecycle)
类比函数广播、状态机

🎯 如何选择?

场景推荐
需要持续监听状态、保存最后一个值StateFlow
一次性事件、多观察者订阅SharedFlow
请求 API 或数据库Flow(冷流)
复杂任务调度Channel

🧠 记忆小技巧

| 冷流 | 像函数:你调我一次,我就执行一次 |

| 热流 | 像广播站:我一直在发,你来我就播给你 |


留言

您的邮箱地址不会被公开。 必填项已用 * 标注