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

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.lryc.cn/news/481899.html

相关文章:

  • 订单日记助力“实峰科技”提升业务效率
  • 如何安装和配置JDK17
  • 智能化温室大棚控制系统设计(论文+源码)
  • 面试题之---解释一下原型和原型链
  • 【Leecode】Leecode刷题之路第46天之全排列
  • 自动驾驶革命:从特斯拉到百度,谁将主宰未来交通?
  • Python __str__()方法
  • 虚拟机的安装
  • HCIP快速生成树 RSTP
  • Python基础学习-05元组 tuple
  • vue3 基于element-plus进行的一个可拖动改变导航与内容区域大小的简单方法
  • c++基础28函数的类型
  • Elasticsearch(四):query_string查询介绍
  • 超好用shell脚本NuShell mac安装
  • Vue禁止打开控制台/前端禁止打开控制台方法/禁用F12/禁用右键
  • volatile关键字
  • [Linux] 共享内存
  • 网络的基础
  • 金融学期末速成笔记
  • 【Elasticsearch入门到落地】1、初识Elasticsearch
  • 电子版产品册代替纸质版产品册,开源节流!
  • npm i忽略依赖冲突
  • 商品,订单业务流程梳理一
  • Spring中的 bean 标签中的 factory-bean , factory-method
  • 车间管理|基于SprinBoot+vue工厂车间管理系统设计与实现(源码+数据库+文档)
  • C#实战:使用腾讯云识别服务轻松提取火车票信息
  • 王珊数据库系统概论第六版PDF+第五版课后答案+课件
  • Spring学习笔记(四)
  • CALL处 F8的“bug“
  • Verilog中的有符号数与无符号数