Kotlin中的StateFlow和SharedFlow有什么区别?

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点

在Kotlin的协程库kotlinx.coroutines中,StateFlowSharedFlow是两种用于处理事件流的API,它们有相似之处,但在设计上的初衷和内在机制上有明显区别。

这次我们就对StateFlowSharedFlow进行深入对比:

StateFlowSharedFlow 概述
  • StateFlow

    • 一种用于持有单一最新状态值并发射给多个观察者的热流。适合用于状态管理场景,例如表示UI状态。
    • 和livedata比较像,有新数据可以通知collect的一方
    • 同时又具有flow的所有特点,比如可以挂起,切换线程
  • SharedFlow

    • 一种通用热流,可以发射事件流而不是仅限于持有最新状态。适合处理事件总线、观察者模式等场景。
    • 也就是一对多的关系,可以有多个collector
    • 同时又具有flow的所有特点,比如可以挂起,切换线程
    • 和上面的StateFlow不同的是,这个不能主动通知collect方,需要不断emit元素,也就是利用了flow的功能

设计初衷不同

  • StateFlow的设计是为了取代ConflatedBroadcastChannel,用于表示状态,并且总是持有最新的状态值。
  • SharedFlow的设计是为了提供一个通用的、可共享的事件流机制,支持事件的重播、缓存等。

状态持有和重播不同

  • StateFlow

    • 总是持有最新的状态值。
    • 新的观察者会立即收到当前持有的状态值。
    • 流中的每个新值都会覆盖之前的值,即只有最新的状态值会被保留。
  • SharedFlow

    • 不会持有单一最新状态值(除非配置了重播缓存)。
    • 可以配置重播机制(replay 参数)以指定新的观察者接收之前多少个已发射的值。
    • 可以配置不同的缓冲策略,如BufferOverflow来定制事件丢弃策略。

类型层次结构

  • StateFlow继承自SharedFlow,所以它是SharedFlow的一种特化实现。
public interface StateFlow<out T> : SharedFlow<T> {
    /**
     * The current value of this state flow.
     */
    public val value: T
}

应用场景

  • StateFlow:适用于状态管理场景,例如在ViewModel中表示UI状态。因为它始终持有最新的状态,能确保观察者总能获得最新的状态。

  • SharedFlow:更加灵活和通用,适用于事件处理、事件总线、消息队列等场景。尤其适合需要重播特定数量的历史事件或者处理事件丢弃政策的场景。

使用对比

StateFlow 使用示例
val _stateFlow = MutableStateFlow<Int>(0) // Initial state
val stateFlow: StateFlow<Int> = _stateFlow

// Collect values
stateFlow.collect { value ->
    println("StateFlow value: $value")
}

// Emit new state
_stateFlow.value = 1
SharedFlow 使用示例
val _sharedFlow = MutableSharedFlow<Int>(replay = 2) // Buffer size of 2
val sharedFlow: SharedFlow<Int> = _sharedFlow

// Collect values
sharedFlow.collect { value ->
    println("SharedFlow value: $value")
}

// Emit new values
_sharedFlow.emit(1)
_sharedFlow.emit(2)
_sharedFlow.emit(3)

重要的API

StateFlow
  • value:获取或设置当前的状态值。
  • collect:收集状态值的变化。
SharedFlow
  • emit:发射一个新事件。
  • collect:收集事件。
  • replayCache:获取重播缓存。

此外,两者还有collectLatest接口,下次我们再来详细对比看看

选择指南

  • 选择StateFlow:如果你的应用场景需要在多个观察者之间共享最新的状态,并且没有兴趣保留状态的历史记录,那么StateFlow是你的最佳选择。
  • 选择SharedFlow:如果你需要一个更通用的事件流机制,并且可能需要缓存和重播事件,SharedFlow提供了更强的灵活性和定制性。

对于StateFlowSharedFlow,你有什么经验和看法?欢迎留言区讨论


欢迎关注我的公众号查看更多精彩文章!

AntDream

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/680793.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

浮点数精度问题(详细)

文章目录 1.什么是浮点数2. 二进制与十进制的转换2.1 二进制与十进制的相互转换(方法介绍&#xff0c;思维理解)2.2 在线转换工具 3.浮点数的 IEEE754 表示4.C# 浮点型float、double 、decimal 比较5.解决运算精度问题5.1 浮点数预算精度问题5.2 解决方案5.2.1 放大倍数计算5.2…

如何根据业务需求,轻松挑选SSL证书?

在当今数字化时代&#xff0c;网站的安全性愈发受到重视。SSL证书作为网站安全的“守门员”&#xff0c;不仅能保护用户数据不被窃取&#xff0c;还能提升网站的信任度。但面对市场上琳琅满目的SSL证书产品&#xff0c;如何根据业务需求挑选合适的证书呢&#xff1f;今天&#…

使用python绘制漏斗图

使用python绘制漏斗图 漏斗图效果代码 漏斗图 **漏斗图&#xff08;Funnel Chart&#xff09;**是一种特殊的图表类型&#xff0c;通常用于显示一系列数据在某个流程或阶段中的逐步减少情况。**漏斗图的形状类似于漏斗&#xff0c;顶部宽而底部窄&#xff0c;每一层代表一个阶…

发文29篇,超过一半二区以上! | NHANES数据库周报(5.22~5.28)

美国国家健康和营养检查调查&#xff08;NHANES&#xff09;是一项旨在评估美国成人和儿童健康和营养状况的研究计划。该调查的独特之处在于它结合了访谈和体格检查。由美国疾病控制和预防中心&#xff08;CDC&#xff09;负责为国家提供健康统计数据。 NHANES计划始于20世纪60…

CsvHelper:一个轻便高性能的Csv文件读写操作开源库!

Csv是一种非常常见的文件格式&#xff0c;采用纯文本格式&#xff0c;不依赖于任何特定的软件或数据库&#xff0c;且文件体积小&#xff0c;易于使用。平常项目开发中&#xff0c;需要都会采用这种格式&#xff0c;这就涉及到Csv文件的读写操作。 下面介绍一个轻便高性能的Cs…

libevent源码跨平台编译(windows/macos/linux)

1.windows编译: 克隆: git clone https://github.com/libevent/libevent.git 克隆成功 生成makefile 生成成功 默认不支持OpenSSL,MbedTLS,ZLIB这三个库 编译: cmake --build . --config release

【二进制部署k8s-1.29.4】十一、metallb的安装部署

文章目录 简介 一.安装metallb二.配置metallb三.验证metallb 简介 本章节主要讲解安装metallb-v0.7.1的安装&#xff0c;metallb算是平民版的负载均衡&#xff0c;用于测试、访问量较小的情况还是比较不错的&#xff0c;但是对于请求量比较的时候&#xff0c;由于流量都集中在一…

Spring AI 第二讲 之 Chat Model API 第四节Amazon Bedrock

Amazon Bedrock是一项托管服务&#xff0c;通过统一的应用程序接口提供来自不同人工智能提供商的基础模型。 Spring AI 通过实现 Spring 接口 ChatModel、StreamingChatModel 和 EmbeddingModel&#xff0c;支持亚马逊 Bedrock 提供的所有聊天和嵌入式 AI 模型。 此外&#xf…

js终止递归

终止递归 1. 实现目标&#xff1a;js 编写递归方法 查找指定节点&#xff1b; 2. 需解决问题&#xff1a;找到所需节点后&#xff0c;递归不会终止&#xff0c;直到所有节点遍历完成后才会停止&#xff0c;会消耗性能 3. 解决方案&#xff1a;优化递归方法&#xff0c;在找到…

什么ERP系统?ERP哪些好用?ERP选型建议参考!

什么是ERP系统&#xff1f; 对于ERP系统的概念&#xff0c;其实很简单的。 假定你公司是贸易&#xff0c;产品只是采购&#xff08;或者贴牌&#xff09;&#xff0c;不用生产&#xff0c;那么erp大概在你公司扮演的是这样的角色&#xff1a; 你的公司接了一笔订单&#xff…

【成品设计】基于STM32单片机的各类联网检测系统

《基于STM32单片机的各类联网检测系统》 所需器件&#xff1a; 医疗空气消毒监控系统的设计与实现 本文在分析了现有智慧医疗子系统相关设计的基础上,针对传统循环风紫外线消毒机信息化程度较低的缺陷,以消毒机的功能需求为切入点,采用物联网层级架构的思想,从软件设计与硬件…

ebay、亚马逊自养号支付下单如何避免账号关联风险?提高成功率。

在亚马逊、ebay平台上&#xff0c;为了降低账号被关联、砍单或F号的风险&#xff0c;卖家及工作室在养号下单时确实需要特别关注所使用的IP和浏览器环境。下面从几个方面进行深刻探讨&#xff1a; 一&#xff1a;IP选择及问题 目前市面上的IP类型多样&#xff0c;如luminati、…

PyQt5学习系列之基础知识“字典”

PyQt5学习系列之基础知识——字典” 啰嗦字典使用字典取值与赋值其他使用 总结 啰嗦 在项目中使用到解析数据存放在字典中&#xff0c;对字典中的数据进行数据转化。即需要使用到字典&#xff0c;并对字典中的数据取值。 字典 一种可变容器模型存储任意类型对象每个键值对&am…

超声波洗眼镜机是智商税吗?四款不能错过的超声波清洗机实力种草

在日常生活中&#xff0c;眼镜成为了我们不可或缺的伙伴&#xff0c;无论是阅读书籍、工作还是享受自然风光&#xff0c;清晰的视野总是至关重要。然而&#xff0c;眼镜上不可避免地会沾染灰尘、油脂甚至细菌&#xff0c;影响我们的视觉体验。传统的眼镜清洗方法虽然简单&#…

即时设计工具对决:Figma、Sketch与XD的优劣比较

最近几年&#xff0c;UI 设计工具出现了许多后起之秀&#xff0c;其中有四款更具代表性的UI设计软件&#xff1a;Sketch、Adobe XD、Figma 和 即时设计&#xff0c;这四个设计软件都有自己的优势。如果合作对您的UI设计过程至关重要&#xff0c;那么Figma 和 即时设计 它应该是…

wmware14虚拟机安装麒麟操作系统

1、首先去麒麟官网申请试用&#xff1a;https://www.kylinos.cn/support/trial.html?trial326339 ​ 我这边试用之后下载了两个操作系统&#xff1a;桌面版和服务器版 百度查了下&#xff1a;各个版本的区别 高级服务操作系统&#xff1a;银河麒麟高级服务器操作系统是一款面…

深圳比创达电子EMC|EMC与EMI一站式解决方案:攻克电磁兼容难题

在当今这个科技日新月异、电子产品层出不穷的时代&#xff0c;电磁兼容&#xff08;EMC&#xff09;与电磁干扰&#xff08;EMI&#xff09;问题愈发凸显其重要性。为了确保电子设备的正常运行&#xff0c;减少电磁干扰对环境和人体的影响&#xff0c;EMC与EMI一站式解决方案成…

【小工具】电磨机

BUSCH DREMEL3000 博世 琢美 技术规范

Springboot二屯村钓鱼场管理系统的设计-计算机毕业设计源码58167

摘 要 在互联网时代的来临&#xff0c;电子商务的骤起&#xff0c;一时间网络进行购物这一形式备受欢迎&#xff0c;到现在&#xff0c;网购更是普及。现如今各个行业也通过网购的方式来进行拓展业务&#xff0c;增加企业的知名度以及提升业绩&#xff0c;满足了用户像网购一样…

玩机进阶教程-------高通芯片机型常规fast模式线刷固件不进系统 高通分区表修复

有的小伙伴误操作手机分区或者刷写一些固件或者一次偶尔的卡机重启都有几率 导致手机分区表损坏。如果你一味的在fast模式线刷固件。开机还是卡第一屏或者重启进fast模式。这种故障的缘由无论你更换多个固件都无法解决。当然卡第一屏或者反复进fast模式不一定是分区表导致的这种…