当前位置: 首页 > article >正文

Android Kotlin Flow 冷流 热流

在 Android 开发中,Flow 是 Kotlin 协程库的一部分,用于处理异步数据流的一个组件。本质上,Flow 是一个能够异步生产多个值的数据流,与 suspend 函数返回单个值的模式相对应。Flow 更类似于 RxJava 中的 Observable,但它更轻量级并且完全集成于 Kotlin 协程体系中。

Flow 可以分为两种类型:冷流(Cold Stream)和热流(Hot Stream)


冷流(Cold Stream):

在代码中直接使用 Flow 默认是一种冷流,只有被调用 collect 函数时数据流逻辑才会开始执行

fun main() {
    runBlocking {
        flow<Int> { // 创建一个 Flow 对象
            for (i in 1..5) {
                delay(1000)
                emit(i) // 发出数据
            }
        }.collect { // 接收数据
            println(it)
        }
    }
}

运行结果:

 

使用 Flow,可以帮助我们更方便地处理异步操作,如网络请求、数据库查询,以及 UI 状态的管理等,通过其非阻塞的特性来提升应用的性能和响应速度。


热流(Hot Stream)

热流在不被调用collect 函数时也可以产生数据,多个订阅者接收的数据是共享的,所以它更像广播的性质。

val shareFlow = MutableSharedFlow<Int>()

fun collectData(name: Int) {
    CoroutineScope(Dispatchers.IO).launch {
        shareFlow.collect { // 作用域阻塞
            println("receive$name: $it")
        }
    }
}

fun main() {
    collectData(1) // 接收者1 接收数据
    collectData(2) // 接收者2 接收数据

    runBlocking {
        for (i in 1..5) {
            delay(1000)
            shareFlow.emit(i) // 发出数据
            println()
        }
    }
}

运行结果:

 

MutableShareFlow 被 collect 时,collect 所在的作用域会被阻塞,并没有提供取消的方法。流的生命周期是由它被收集的环境(协程、作用域等)来管理的,而不是流本身


这样介绍下来 Flow 和 LiveData 的作用其实是差不多的,但 Flow 多了内置的背压处理机制,Flow 支持数据流的控制(例如 conflate、buffer 等操作符)

在数据的 生产者-消费者 模型当中,消费者的数据处理速度有限的情况下,若生产者还在持续推送数据的话,消费者可能出现压力过大而造成卡顿的问题。Flow 的数据背压处理机制就能很好的解决这个问题


总体来说,Flow 提供了一种现代化的方式来处理数据流,相比于传统回调和 RxJava 解决方案,它利用了 Kotlin 协程的强大功能,使代码更加简洁和易于管理。


http://www.kler.cn/a/385049.html

相关文章:

  • js-v-for 指令来循环展示数组中的数据,并在每条数据后添加一个删除按钮 items.splice(index, 1)
  • JS实现,防抖节流 + 闭包
  • 【C】无类型指针及函数指针
  • 使用 API 和离线库查询 IP 地址方法详解
  • 使用 Mac 数据恢复从 iPhoto 图库中恢复照片
  • 用示例来看C2Rust工具的使用和功能介绍
  • C++中,如何找到一个vector中最大的元素
  • 【HarmonyOS】键盘遮挡输入框UI布局处理
  • Flux comfyui 部署笔记,整合包下载
  • MySQL常用的关键字(详细)
  • MATLAB 在数组的元素后面使用百分号 `%` 添加注释时会将其误认为是行分隔符,导致数组维度不一致
  • LangChain实战分享
  • 【Linux】进程信号全攻略(二)
  • 什么是 AWS PrivateLink
  • 深入理解Python设计模式:工厂模式实践与应用
  • SpringCloud Sentinel 服务治理详解
  • 群控系统服务端开发模式-应用开发-系统配置开发
  • netstat中sendq/recvq用于排查发送端发送数据的问题
  • js中怎么把excel和pdf文件转换成图片打包下载
  • 云上拼团GO指南——腾讯云博客部署案例,双11欢乐GO
  • 推导将点映射到平面坐标系的计算公式
  • 金媒婚恋相亲系统10.4择爱开源旗舰版支持微信小程和抖音小程序上架
  • 鸿蒙系统与python
  • 【WebRTC】视频采集模块流程的简单分析
  • 收集的linux命令/Docker命令/git命令
  • 第2章-立项2.5立项的三重境界