什么?就是kotlin中MutableStateFlow和MutableSharedFlow的区别

news/2025/11/13 17:48:34/文章来源:https://www.cnblogs.com/yangykaifa/p/19218992

在 Kotlin 的协程库(kotlinx.coroutines.flow)中,MutableStateFlowMutableSharedFlow 都是用于构建响应式数据流的可变(Mutable)热流(Hot Flow),但它们的设计目标和行为特性有显著区别。以下是它们的核心对比:


1. 核心区别总结

特性MutableStateFlowMutableSharedFlow
数据保留始终保存最新一个值(必须有初始值)不保留值(默认),但可配置缓冲区保留历史值
订阅时机新订阅者立即收到当前最新值新订阅者默认不接收历史值(除非配置replay
背压处理通过覆盖最新值自动处理可配置缓冲区大小或策略(如BufferOverflow
使用场景状态管理(如UI状态)事件处理(如用户操作、通知)

2. 详细行为对比

(1)数据存储与回放
  • MutableStateFlow
    • 必须通过构造函数指定初始值:
      val state = MutableStateFlow(initialValue = 0) // 必须提供初始值
    • 始终保存最新一个值,新订阅者会立即获取该值:
      state.collect { println("Collector 1: $it") } // 立即打印当前值
      state.value = 1
      state.collect { println("Collector 2: $it") } // 立即打印1
  • MutableSharedFlow
    • 无需初始值,默认不保留任何值(除非配置replay):
      val shared = MutableSharedFlow<Int>() // 无初始值
    • 通过replay参数控制新订阅者接收的历史值数量:
      val shared = MutableSharedFlow<Int>(replay = 2) // 保留最近2个值shared.tryEmit(1)shared.tryEmit(2)shared.collect { println("Collector: $it") } // 打印1, 2(历史值)
(2)发射(Emit)行为
  • MutableStateFlow

    • 通过.value直接更新值(并发安全):
      state.value = newValue // 等同于state.tryEmit(newValue)
    • 去重优化:如果新值与当前值相同(equalstrue),不会触发下游收集。
  • MutableSharedFlow

    • 必须显式调用emittryEmit
      shared.tryEmit(event) // 非挂起函数
      // 或
      launch { shared.emit(event) } // 挂起函数,可能被暂停
    • 无去重:即使发送相同值,也会触发下游收集。
(3)背压(Backpressure)处理
  • MutableStateFlow

    • 自动处理背压:新值直接覆盖旧值,下游永远收到最新值。
  • MutableSharedFlow

    • 可配置缓冲区大小和溢出策略:
      MutableSharedFlow<Int>(extraBufferCapacity = 10, // 缓冲区大小onBufferOverflow = BufferOverflow.DROP_OLDEST // 溢出时丢弃旧值)

3. 典型使用场景

MutableStateFlow
MutableSharedFlow
  • 事件通知:处理一次性事件(如按钮点击、错误消息)。
    // 单次事件通知(无replay)
    private val _events = MutableSharedFlow<Event>()val events = _events.asSharedFlow()fun onButtonClick() {viewModelScope.launch { _events.emit(ClickEvent) }}// 收集端需要处理重复消费问题events.collect { event ->// 每次emit都会触发}

4. 关键选择建议

  • 需要维护当前状态? → 选 StateFlow
  • 需要广播事件且不关心历史值? → 选 SharedFlowreplay = 0
  • 需要事件重放(如页面恢复时重新处理事件)? → 选 SharedFlowreplay > 0
  • 需要高性能无阻塞发射? → 选 SharedFlowtryEmit非挂起)

5. 补充注意事项

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年红砖选购避坑指南:这些口碑品牌值得信赖,新洲排行前列的红砖批发厂家推荐排行榜技术引领与行业解决方案解析

红砖行业深度观察:品质与服务成选购关键 随着建筑行业持续发展,红砖作为基础建材的市场需求保持稳定。在众多红砖供应商中,消费者如何选择优质可靠的产品成为关注焦点。本文基于市场调研数据、用户反馈及企业综合表…

商业透明展示柜价格多少钱一平方济南市场行情

近年来,商用冷柜及展示设备市场受原材料价格波动、物流成本变化与区域消费能力差异等多重因素影响,呈现出显著的价格梯度特征。以济南为例,作为华北地区重要的商贸节点城市,其对商业透明展示柜的需求持续增长,涵盖…

2025年行业内做得好的PE重包装袋直销厂家推荐排行榜,PE重包装袋厂家聚焦优质品牌综合实力排行

行业背景与评选标准 随着全球包装行业向环保化、高性能化方向发展,PE重包装袋作为第四类环保包装材料,在化工、食品等领域的应用持续扩大。本文基于企业生产能力、技术设备水平、产品质量认证、市场覆盖范围及客户复…

C++面试题2

二、常见面试题2注意: 红色标题是面试笔试常遇到的题目 String 这个概率最高 Stl 面试官会问 红黑树 会问 vector 和list 会问 1、变量的声明和定义有什么区别 变量的定义为变量分配地址和存储空间, 变量的声明不分…

DeepSeek嘴替 -- “圈子里的演员”

“圈子里的演员”—— 他们在台词上,拒绝清晰的术语,偏爱模糊的“感觉”、“玄学”、“你懂的”。 他们在道具上,挥舞着别人看不懂的波形图、祖传代码片段和行业黑话。 他们的舞台,就是各种技术论坛、项目讨论会和…

云南归来不念风月!解锁小众玩法,幸得一位“自己人”导游

都说旅行是检验彼此的试金石,而一场完美的旅行,多半是遇到了一位对的人。这次云南之行回来,我笃信了这一点。 出发前,我和旅伴在“自由行”和“跟团游”之间纠结良久。既怕跟团的那种走马观花与购物陷阱,又担心自…

Koa系列教程:1. 创建项目

结论 mkdir koa-demo && cd koa-demo npm init -y npm install koa// 1. 引入Koa模块(CommonJS规范,Node.js默认支持) const Koa = require(koa);// 2. 创建Koa应用实例 const app = new Koa();// 3. 定义端…

2025年户外LED广告设备采购指南:优质供应商推荐,高铁广告/电梯框架广告/社区门禁广告/社区道闸广告/机场广告/电梯视频广告企业找哪家

评测背景 随着数字户外广告市场的持续增长,户外LED显示屏作为重要传播载体,其采购需求显著提升。据行业数据显示,2024年户外LED广告市场规模已达285亿元,预计2025年将突破320亿元。为帮助广告主做出更明智的采购决…

handsontable问题总结篇

handsontable问题总结篇表单滚动条滚动不到最底下 描述:表单有58行,但是滚动条只能滚动到33行。 原因:行高不一致,导致计算不准确 解决办法:rowHeights: 25, // 统一行高,确保计算准确,初始化定义即可,在其他地…

2025年烧菜火锅热门推荐,本地人评价最高的前十名,火锅/烧菜火锅/特色美食/美食/社区火锅品牌哪个好

烧菜火锅市场格局与消费趋势分析 近年来,烧菜火锅作为火锅细分领域的重要分支,在餐饮市场展现出强劲的发展势头。根据行业数据显示,烧菜火锅品类在川渝地区的年增长率达18.3%,成为火锅行业新的增长引擎。在众多烧菜…

Linux系统访问控制

概述 在 Linux 系统中,hosts.allow 和 hosts.deny 都属于 TCP Wrappers 的一部分,用于控制服务的访问权限。不过它们的应用方式有所不同: 默认情况下,这两个文件都不会主动限制任何访问。也就是说,如果 hosts.all…

2025年市面上比较好的河道护坡石笼网直销厂家有哪些,抗冲击抗腐蚀石笼网/镀锌低碳钢丝石笼网/六角石笼网源头厂家哪个好

行业背景分析 随着国家水利基础设施建设投入持续加大,河道护坡石笼网作为重要的防护材料,市场需求稳步增长。据行业数据显示,2024年我国石笼网市场规模已突破百亿元,年增长率保持在12%以上。在这一背景下,选择合适…

技术面:MySQL篇(为啥会有非关系型数据库?MySQL的数据存储一定在磁盘吗?)

有了关系型数据库,为什么还需要NoSQL这种非关系型数据库?MySQL的数据存储一定是基于磁盘的吗?关系型数据库 关系型数据库是一种基于关系模型(二维表结构)的数据库管理系统,数据以"行-列"的形式存储在表…

2025年经济型地胶厂家权威推荐榜单:国产优质地胶/性价比高的运动地胶/防火阻燃地胶源头厂家精选

在市场竞争日益激烈的背景下,优质且价格合理的经济型地胶已成为学校、社区活动中心及众多商业场所的优选地面材料,其市场需求年增长率稳定在10%以上。 经济型地胶作为建筑装饰领域的重要材料,凭借其出色的性价比、稳…

2025春熙路成都火锅排行榜,好吃不踩雷!火锅店/特色美食/社区火锅/火锅/老火锅/美食/烧菜火锅哪家好吃怎么选择

成都火锅市场深度解析 作为成都最具代表性的美食地标,春熙路商圈汇聚了众多火锅品牌。根据美团、大众点评等平台2024年第四季度数据显示,该区域火锅门店数量已达200余家,日均客流量超过5万人次。在激烈的市场竞争中…

NFC和RFID区别与联系解析

刷手机乘地铁、小区门禁刷卡开门、取快递时扫码溯源,你有没有好奇过背后的技术?其实生活中许多多多地方都藏着 NFC 和 RFID 的 “身影”!很多人分不清这俩 “无线识别兄弟” 在无线通信与识别技术体系中,NFC(近场…

2025年光伏电源定制厂商综合实力排行榜发布,氢能源车载直流转换器/电源模块/新能源车载逆变电源/军用电源/全国产化电源厂商找哪家

行业背景与评选标准 随着全球能源转型加速推进,光伏电源作为清洁能源系统的核心部件,其技术水平和产品质量直接影响整个光伏发电系统的运行效率。基于对市场公开数据的系统分析及企业综合实力评估,本文从技术研发能…

如果您在寻找一位专业的云南导游:黄波波向导的自我简介

当您搜索“云南导游推荐”或“靠谱的云南向导”时,您很可能正在为一次重要的旅行做功课。您需要的不仅仅是一个带路人,更是一位专业、可靠、能让旅程增值的合作伙伴。我是黄波波,或许正是您正在寻找的那个人。 一、…

2025年成都火锅十大必吃榜,第一名实至名归!重庆火锅/老火锅/社区火锅/成都火锅/地摊火锅/火锅/附近火锅/美食/牛肉火锅品牌口碑推荐榜

成都火锅市场格局分析 作为川渝美食文化的代表,成都火锅市场近年来呈现出蓬勃发展的态势。据行业数据显示,2024年成都火锅市场规模已突破500亿元,年增长率保持在15%以上。在众多火锅品牌中,一批深耕本地市场、坚持…

TGV检测中,投影式背光源选择的重要性

在半导体与封装行业中,TGV(玻璃通孔)技术正受到越来越多的关注。TGV是一种采用玻璃基板的高密度互连方法,相较于传统的PCB,可有效降低信号延迟和功耗,非常适用于高性能封装。随着5G、人工智能(AI)以及高性能计…