(StateFlow ShareFlow) VS (Flow LiveData)

目录

数据流程

大致流程

切换线程

StateFlow & ShareFlow

StateFlow

构建StateFlow &ShareFlow


在之前的Flow,collect函数浅析和仿Flow构建器创建数据流文章中我们探索了flow的简单使用及它的简单原理,但是生产过程中我们往往会借用这些基础的api实现我们复杂的逻辑处理,根据需求也推出了StateFlow和SharedFlow这两个特殊的flow。接下来开始看下这几个Flow的特殊之处和应用场景吧~~

官方推荐的Flow数据流流向:

数据流程

数据流包含三个实体:

  • 提供方会生成添加到数据流中的数据。得益于协程,数据流还可以异步生成数据。
  • (可选)中介可以修改发送到数据流的值,或修正数据流本身。
  • 使用方则使用数据流中的值。

数据流中包含的实体;使用方、可选中介和提供方

大致流程

  • Producer通过MVVM的Model层提供,DDU的DataLayer层提供原始数据流;
  • Intermediary通过MVVM的ViewModel层,DDU的DomainLayer层提供转换可直接用于显示的数据流的操作
  • Consumer通过MVVM的View层,DDU的UI层使用转换后的数据流进行渲染展示数据。

flow的基础使用就不介绍了,读者可以查看开头提供的两个链接查看。

切换线程

在flow内部不允许使用不同的ConretineContext进行emit提交数据,所以想要在内部切换线程可以通过flowOn操作符进行转换

StateFlow & ShareFlow

StateFlow 和 SharedFlow 是 Flow API,允许数据流以最优方式发出状态更新并向多个使用方发出值。

这两个Flow和普通的Flow不一样, Flow我们知道,只有当调用collect的时候flow传入的函数才会执行,并且每次调用collect都会重新走一遍flow函数(本质是扩展函数),调用collect的时候执行这个扩展函数;但是这两个Flow不一样他们不依赖于外部调用(可配置稍后说明),他们是热流,他们发出的数据会缓存起来当有订阅者的时候再通知订阅者

StateFlow 和 SharedFlow是发出状态更新并向多个使用方发出值并且可以通过value属性获取当前最新值。类似于观察数据,数据更新,使用方接受最新数据是不是和LiveData很像。确实像,但他比LiveData更强大~~

StateFlow
  • 线程切换:相比于LiveData更新数据的操作只能在主线程进行,但是Flow可以通过flowOn来在不同的Dispatchers(线程分发器,CoruntineContext的一种)上运行切换线程的操作更加方便
  • 数据回溯:相比于LiveData自动管理version来决定是否通知Ovserve并且只能收到最新值的方式,Flow可通过构造函数配置reply字段决定获取之前的几次数据更新
  • 生命周期处理: 对于LiveData来说,通过观察调用observe函数的时候传入LifecycleOwner内部注册生命周期回调的方式相比;Flow的观察collect函数需要在协程中调用也就是需要自动管理协程的生命周期,否则可能会出现协程开启收到数据变化更新UI发送NPE的错误,所以需要控制好调用collect的协程域Scope的生命周期,好在Android提供了几个协程作用域的api去开启: 1.viewModelScope:跟随ViewModel的生命周期变化,当ViewModel观察的组件销毁调用onClear的时候自动取消协程,生命周期过长不采取一般在对数据进行处理的时候会使用

2.lifecycleScope: 此范围内启动的协程会在 Lifecycle 被销毁时取消;也可以通过when生命周期来指定何时开启,如果 Lifecycle 未至少处于所需的最低状态,则会挂起在这些块内运行的任何协程,注意是挂起而不是销毁时的取消,意味着还是会浪费资源。

一定要注意取消这个词和挂起的区别,挂起其实还是有订阅关系的当flow发射时还是会收到走collect上游并没有取消,但是取消就是协程作用域的取消collect函数不会执行了。

但是我们可以使用repeatOnLifecycle,它当离开某个生命周期的时候进行取消,符合的时候在开启一个新协程(也即会重新执行collect函数是新的订阅者)。

Android官方的警告:倾向于使用 repeatOnLifecycle API 收集数据流,而不是在 launchWhenX API 内部进行收集。由于后面的 API 会挂起协程,而不是在 Lifecycle 处于 STOPPED 状态时取消。上游数据流会在后台保持活跃状态,并可能会发出新的项并耗用资源

  • 需要给定一个初始值。
构建StateFlow &ShareFlow

官方示例:

将普通flow转换为ShareFlow(StateFlow的一种)通过shareIn操作符 需要传入以下三个参数: (这三个参数)

class NewsRemoteDataSource(...,
    private val externalScope: CoroutineScope,
) {
    val latestNews: Flow<List<ArticleHeadline>> = flow {
        ...
    }.shareIn(
        externalScope,
        replay = 1,
        started = SharingStarted.WhileSubscribed()
    )
}
  • externalScope:用于共享数据流的 CoroutineScope。此作用域函数的生命周期应长于任何使用方,以使共享数据流在足够长的时间内保持活跃状态。(超出该作用域时flow下游逻辑取消

repeatOnLifecycle针对生命周期取消订阅流的收集(上游)collect函数(符合在开启新协程重新订阅),WhileSubscribed策略配置订阅者超时时间进行取消flow函数(下游) 搭配好这两个一个是订阅者一个是被订阅者的关系处理好业务逻辑

  • replay:要重放 (replay) 至每个新收集器的数据项数量。(发射值的时候也会存储值,可理解为配置缓冲区大小用于之后“回放”)
  • started:“启动”行为政策。 1.WhileSubscribed()当存在活跃订阅者(观察flow的协程域没有被取消)时flow函数也会活跃(执行flow函数),可配置最后一个订阅者取消订阅的超时时间进行取消flow函数运行也可以配置数据过期时间(超过一段时间将会从缓冲中移除)

2.SharingStarted.Eagerly 可立即启动提供方(flow函数立马运行),使用 SharingStarted.Lazily 可在第一个订阅者出现后开始共享数据(只有当订阅时才会运行)并且都在externalScope作用域取消时取消收集。

行为政策链接

除此之外还可定义其他SharedFlow 行为:

  • 通过 replay,您可以针对新订阅者重新发送多个之前已发出的值。

  • 通过 onBufferOverflow,您可以指定相关政策来处理缓冲区中已存满要发送的数据项的情况。默认值为 BufferOverflow.SUSPEND,这会使调用方挂起。其他选项包括 DROP_LATEST 或 DROP_OLDEST

  • 通过 subscriptionCount 属性,获取活跃状态的收集器的数量。

  • 通过 resetReplayCache 函数清空数据缓存,供您在不想回放已向数据流发送的最新信息的情况下使用。

原文链接:(StateFlow & ShareFlow) VS (Flow & LiveData) - 掘金 (juejin.cn)

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

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

相关文章

小程序订单中心path设置本次审核不通过,审核原因:小程序尚未发布,无法审核。

小程序尚未发布&#xff0c;无法审核。 先按照这篇文章把小程序审核通过&#xff0c;小程序版本审核未通过&#xff0c;需在开发者后台「版本管理—提交审核——小程序订单中心path」设置订单中心页path&#xff0c;请设置后再提交代码审核 小程序审核通过后&#xff0c;发布…

高效自学-网络安全(黑客技术)

一、网络安全应该怎么学&#xff1f; 1.计算机基础需要过关 这一步跟网安关系暂时不大&#xff0c;是进入it行业每个人都必须掌握的基础能力。 计算机网络计算机操作系统算法与数据架构数据库 Tips:不用非要钻研至非常精通&#xff0c;可以与学习其他课程同步进行。 2.渗透技…

Vue计算属性 computed

计算属性&#xff1a;常用于逻辑比较复杂的计算&#xff0c;根据已有的数据&#xff0c;计算出一个新的数据。计算属性具有缓存机制&#xff0c;复用性强&#xff0c;效率更高。 计算属性【简写方式】&#xff1a; <template><div>提现金额&#xff1a;<input …

【漏洞复现】XXL-JOB默认accessToken身份绕过远程命令执行漏洞

漏洞描述 xxl-job是一个中心式分布式的调度平台,调度中心和执行器解耦,执行器和业务代码耦合,代码的侵入性少,学习简单、开发简单、轻量级 XXL-JOB 是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线…

树莓派4B的测试记录(CPU、FFMPEG)

本文是用来记录树莓派 4B 的一些测试记录。 温度 下面记录中的风扇和大风扇是这样的&#xff1a; 为什么要用大风扇呢&#xff1f;因为小风扇在外壳上&#xff0c;气流通过外壳的珊格会有啸叫&#xff0c;声音不大但是很烦人&#xff0c;大风扇没这个问题&#xff0c;并且同样…

【计算机网络基础实验】实验二(补充内容)路由器的配置和静态路由

任务一 IP路由协议实现企业路由器通信 目录如下&#xff1a; 任务一 IP路由协议实现企业路由器通信一、实验目的&#xff1a;二、实验环境三、实验内容四、实验步骤1、路由器的基本配置&#xff08;1&#xff09;实验拓扑图&#xff08;2&#xff09;启动路由器&#xff08;3&a…

k8s-Pod控制器

一、Pod控制器 1.Pod控制器及其功用 Pod控制器&#xff0c;又称之为工作负载&#xff08;workload&#xff09;&#xff0c;是用于实现管理pod的中间层&#xff0c;确保pod资源符合预期的状态&#xff0c;pod的资源出现故障时&#xff0c;会尝试进行重启&#xff0c;当根据重启…

猫头虎博主第7期赠书活动:《计算机考研精炼1000题》

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

设计模式(3)-结构型模式

结构型模式 结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式&#xff0c;前者采用继承机制来组织接口和类&#xff0c;后者釆用组合或聚合来组合对象。 由于组合关系或聚合关系比继承关系耦合度低&#xff0c;满足“合成复用原则…

数据结构 - 全貌总结

目录 一. 前言 二. 分类 三. 常见的线性和非线性结构 一. 前言 数据结构是计算机存储、组织数据的方式。一种好的数据结构可以带来更高的运行或者存储效率。数据在内存中是呈线性排列的&#xff0c;但是我们可以使用指针等道具&#xff0c;构造出类似“树形”等复杂结构。 数…

ubuntu 安装 zsh、ohmyzsh并配置必要插件

下述记录是完成全部操作后回忆记录得来&#xff0c;或有不准确。我只记录安装中确实用到的指令&#xff0c;参考资料中有扩展内容&#xff0c;记录如下&#xff1a; ubuntu使用zsh终端并安装nerd font字体——nerd font字体不太好安装&#xff0c;使用fonts-powerline替代。 Ub…

Masked Image Training for Generalizable Deep Image Denoising 论文阅读笔记

CVPR2023 港科大&#xff08;广州&#xff09;发的一篇denoising的论文&#xff0c;作者里面有上海AILab的董超老师&#xff08;看introduction的时候看到有一段很像董超老师 Networks are slaching off 的论文的思想&#xff0c;说网络overfitting的时候学习了训练集的噪声模式…

NR DCI size alignment

DCI对齐在38.212 7.3.1.0 DCI size alignment 中讲述。 Step 0 CSS 下&#xff0c;DCI 0_0根据初始UL BWP 确定大小&#xff0c;DCI 1_0 根据CORESET0 或初始DL BWP&#xff08;没有CORESET 0时&#xff09; 确定大小 根据激活的UL/DL BWP 确定DCI 0_0和DCI 1_0 的size&…

DehazeNet: An End-to-End System for Single Image Haze Removal(端到端的去雾模型)

1、论文去雾总体思路 DehazeNet是2016年华南理工大学的研究者提出的一个端到端的深度学习模型&#xff0c;该模型主要通过输入的原始有雾图像拟合出该图所对应的medium transmission map&#xff08;透射率t值图&#xff09;&#xff0c;并使用引导滤波对t值进行refine&#x…

TSINGSEE青犀智能分析网关工服识别算法,如何最大限度保障工人安全?

众所周知&#xff0c;TSINGSEE青犀智能分析网关算法繁多&#xff0c;大多数算法已经和大家讲解过了&#xff0c;今天就和大家聊一聊工服识别算法。工服识别算法一般应用于工地、化工、煤矿等场所&#xff0c;用来监督检测施工人员是否按照要求着工服&#xff0c;最大程度保障人…

【Spring】Spring IOCDI详解

文章目录 1. Spring是什么&#xff1f;2. 认识IOC2.1 传统程序开发1. Main.java2. Car.java3. Framework.java4. Bottom.java5. Tire.java 2.2 分析传统开发2.3 IOC程序开发1. Main.java2. Car.java3. Framework.java4. Bottom.java5. Tire.java 2.4 分析IOC开发2.5 IOC容器优点…

软件测试-根据状态迁移图设计测试用例

测试用例状态迁移图 许多需求用状态机的方式来描述&#xff0c;状态机的测试主要关注状态转移是否正确。对于一个有限状态机&#xff0c;通过测试验证其在给定的条件内是否能够产生需要的状态变化&#xff0c;有没有不可达的状态和非法的状态&#xff0c;是否可能产生非法的状…

探索人工智能领域——30个名词详解

目录 前言 正文 总结​​​​​​​ &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo__✍️原创&#xff0c;首发于CSDN&#x1f4da;。 &#x1f4e3;如需转载&#xff0c;请…

学习OpenCV(蝴蝶书/C++)相关——2.MacOS下使用LLDB调试cpp程序

文章目录 1. VScode中的调试2. 配置VSCode中C++的调试(以OpenCV为例)2.1 创建适用于C++的.launch文件2.2 常见参数说明2.3 调试OpenCV的.launch文件示例2.3.1 .launch文件demo2.3.2 Debug模式的可执行文件之前在 mac下vscode配置c++环境用过简单的launch.json的配置。 但是不足…

Netty第三部

继续Netty第二部的内容 一、ChannelHandler 1、ChannelHandler接口 ChannelHandler是Netty的主要组件&#xff0c;处理所有的入站和出站数据的应用程序逻辑的容器&#xff0c;可以应用在数据的格式转换、异常处理、数据报文统计等 继承ChannelHandler的两个子接口&#xff…
最新文章