「本文已参与好文召集令活动,点击查看:后端、大前端双赛道投稿,2万元奖池等你应战!」

前语

翻开Android架构组件页面,咱们能够发现一些最新发布的jetpack组件,如RoomDataStore, Paging3,DataBinding 等都支撑了Flow
Google开发者账号最近也发布了几篇运用Flow的文章java作业培训班,比方:从 LiveData 迁移到java面试题 Kotlin 数据流
看起来官方在大力举荐运用java言语Flgoogleplayow替代LiveData,那么问题来了,有必要吗?
LiveData用得好好的,有必要架构师证书再学kotlin面试题Flow吗?本文首要答复这个问题,详细包含以下内容
1.LiveData有什么短少?
2.Flow介绍以及为什么会有Flow
3.SharedFlowStateFlow的介绍与它们之间的差异

本文详细目录如下所示:
官方举荐 Flow 替代 LiveData,有必要吗?

1. LiveDat安全手抄报a有什么短少?

1.1 为什么引进Likotlin协程原理veData?

要了解LiveD安全ata的短少,咱们先了解下LiveData为什么被引进

LiveData 的历史要追溯到 2017 年。彼时,查询者方式有用简化了开发,但比方 RxJava 一类的库对新手而言有些过分杂乱。为此,架google空间构组件团队打造了 LiveData: 一个专用于 Androidjava开发 的具有自主生命周期感知才华的可查询的数googleplay据存储器类。LiveData 被有意简化规划,这使得开发者很简单上手;而关于较为杂乱的交互架构师和程序员的差异数据流场景,建议您运用 RxJava安全教育,这样两者结合的优势就发挥出来了

能够看安全手抄报出,LiveDatajava难学吗便是一个简略易用的架构师,具有感知生命周期才华的查询者方式
它运用起来非常简略,这是它的长处,也是它的短少,由于它面对比较杂乱的交互数据流场景时,处理起来比较费事

1.2 LiveData的短少

咱们上文googleplay安卓版下载说过L架构师需求把握哪些常识iveData结构kotlin协程原理简略,可是不行强健,它有以下短少
1.LiveData只能在主线程安全教育渠道登录进口更新数据
2google浏览器.LiveDgoogle服务结构ata的操作符不行强健,在处理杂乱数据流时有些捉襟见肘

关于LiveData只能在主线程更kotlin和java新数据,有的同学或许要问,不是有postValue吗?其实postValue也是需求切换到到主线程的,如下图所示:
官方举荐 Flow 替代 LiveData,有必要吗?
这意味着当咱们想安全期是哪几天要更新LiveData方针时,咱们会常常更改线程(作业线程→主线程),假定在修改LiveData后又要切换回到作业线程那就更费事了,一起postValue或许会有丢数据的问题。

2. Flow介绍

Flow 便是 Kotlgoogleplay安卓版下载in 协程与呼应式编程模型结合的产品,你会发现它与 RxJava 非常像,二者之间也有彼此转化的 API,运用起来非常便利。

2.1 为什么引进Flo安全工程w

为什么引进Flow,咱们可架构图用什么软件做以从Flow处理了什么问题的视点切安全教育渠道登录进口

  1. LiveData不支撑线程切换,一切数据转化都将在主线程上完毕,有时需求频频更改线程,面对杂乱数据流时处理起来比较费事
  2. RxJava又有些过于架构费事了,有许多让人傻傻分不清的操作符,入门门槛较高,一起需求自己处理生命周期,在生命周期完毕时撤消订阅

能够看出,kotlin面试题Flow是介于LiveDataRxJava之间的一个处理安全教育计划,它有以下特征

  • Flow 支撑线程切换、背压
  • Flow 入门的门java开发槛很低,没有那么多傻傻分不清楚的操作符
  • 简略的数据转化与操作符,如 map 等等
  • 冷数据流,不消费则不出产安全出产法数据,这一点与LiveData不同:LiveData的发送端并不依赖于接收端。
  • 归于kotlin协程的一部分架构师,能够很好的与协程基础设施结合

关于Flow的运用,比较简略,有爱好的同学可参看文安全教育渠道登录进口档:Flow文档

3. SharedFlow介绍

咱们上面介绍过,java难学吗Flow 是冷流,什么是冷流?

  • 冷流 :只需订阅者订阅时,才开始实行发射数据流的代码。而且冷流订阅者只能是1对1的联络,当有多个不同的订阅者时,音讯是从头Kotlin完好发送的。也便是说对冷流kotlin怎样读而言,有多个订阅者的时分,他们各自的作业是独立的。
  • 暖流:不论有没有订阅者java怎样读架构图模板,作业一向都会产生。当 暖流有多个订阅者时,暖流订阅者们的联络是一对多的联络,能够与多个订阅者同享信息。

3.1 为什么引进SharedFlkotlin极简教程ow

上面其完毕已说得很清楚了,冷流订阅者只能是1对1的联络,当咱们要完毕一个流,多个订阅者的需求时(这在开发中是很常见的),就需求暖流架构
从命名上也很简单了解,SharedFlow即同享的Flow,能够完毕一对多联络,SgoogleharedFlow是一种暖流

3.2 SharedFlow的运用

咱们来看看SharedFlowjava作业培训班的结构函数

p安全教育渠道登录进口ublic fun <T> MutableSharejava面试题dFlow(
replay: Int = 0,
extraBufferCapacity: Int = 0,
onBufferjava言语Overflow: BufferOverflow = Buffjava面试题erOverflow.SUSPEND
)架构图: Mujava开发tgoogle浏览器ableSharedFlow<T>

其首要有3个参数
1java开发.replay标明当新的订阅者Collect时,发送几个现已发送过的数据给它,默许为0,即默许新订阅者不会获取早年的数据
2.extraBufferCapacity标明减去replayMutableSharedFlow还缓存多少googleplay数据,默许为0
3.onBufferOverflow标明缓存战略,即缓冲区满了之后Flow怎样处理,默许为挂起

简略运用如下:

//ViewModel
val sharedFlow=MutableSharedFlow<String>()
viewModelScope.launch{
s架构是什么意思haredFlow.emit("Hello")
sharedFlow.架构是什么意思emit("SharedFlow")
}
//kotlin怎样读Activity
lifecycleScope.launch{
viewMode.sharedFlow.collect {
print(it)
}
}

3.3 将冷流转化为SharedFlow

一般flow可运用shareIn扩展方法,转化成SharedFlow

    val sharedFlow by lazy {
flow<Int> {
//..Google.
}.shareIn(viewModelScope, WhileSubscribed(500), 0)
}

shareIn首要也有三个参数:kotlin面试题

@param scope 同享开始时地点的协程效果域规模
@param started 操控同享的开始和完毕的战略
@param replay 状况流的kotlin为什么盛行不起来重播个数

started 接受以下的三个值:
1.Lazily: 当首个订阅者出现时开始,在scope指定的效果域被完毕时中止。
2.Eagerly: 当即开始,而在scope指定的效果域被完毕时中止。
3.WhileSubscribed: 这种状况有些杂乱,后边Kotlin会详细说明

关于那些只实行一次的java作业培训班操作,您能够运用Lazily或许Eagerly。可是,假定您需求查询其他的流,就应该运用WhileSubscjavascriptribed来完毕纤细但又重要的优化作业

3.4 Whilesubscribed战略

WhileSubscribed战略会在没有收kotlin为什么盛行不起来集器的状况下google谷歌搜索主页撤消上游数据流,经过sharjava怎样读eIn运算符创建的kotlin面试题SharedFlow会把数据显露给视图 (View安全),一起也会查询来自其他层级或许是上游运用的数据流。
让这些流继续生动或许会引起不必要的安全工程资源浪费,google服务结构例如一向经过从数据库联接、硬件传感器中读取数据等等。当您的运用转而在后台工作时,您应当坚持按捺并接连这些协程。

public fun WhileSubscribedKotlin(架构师证书
s架构师证书topTim架构师证书eoutMillis: Long = 0,
replayExpirationMillis: Long = Long.MAX_VALUE
)

如上所示,它支撑两个参数:

  • 1.stopTimeoutMillis 操控一个以毫秒为单位的推迟值,指的是毕竟一个订阅者完毕订阅与接连上游流的时刻差。默许值是 0 (当即接连).这个值非常有用,由于您或许并不想由于视图有几秒钟不再监听就完毕上游流。这种状况非常常见——比方google浏览器当用户旋转设备时,原本的视图会先被销毁,然后数秒安全教育钟内重建。
  • 2.replayExpirationMill架构是什么意思is标明数据重播的过期时刻,假定用户脱离运用太久,此刻您javaapi中文在线看不想让用户看到陈旧的数据,你能够用到这个参数

4. StateFlow介绍

4.1 为什么引进StateFlow

咱们前面刚刚看了SharedFlow,为什么又冒出个StateFlow?
StateFlo安全wSharedFlow 的一个比较特别的变种,StateFlo安全出产法wLiveData 是最接近的kotlin言语,由于:

  • 1.它一向是有值的。架构是什么意思
  • 2.它的值是仅有的。
  • 3.它容许被多个查询者共用 (因而是同享的数据流)。
  • 4.它永久只会把最新的值重现给订阅者,这与生动架构师证书查询者的数量是无关的。

能够看出,StateFlowLiveData是比较接近的,能够获取当时的值,能够想像之所以引进Sta架构图用什么软件做teFlow架构师证书便是为了替换LiveData
google谷歌搜索主页结如下:
1.StateFlow承继于SharedFlow,是SharedFlow的一个特别变种
2.StateFlowLiveData比较邻近,信赖之所以推出便是为了替换LiveData

4javaapi中文在线看.2 StateFlow的简略运用

咱们先来看看结构函数:

public fun <T> MutableStateFgoogle翻译low(value: T): MutableStateFlow<T> = StateFlowImpl(value ?: NULL)

1.StateFlow结构函数较为简略,只需求传入一个安全期是哪几天默许值
2.StateFlow本质上是一个replay为1,而且没有缓冲区的SharedFlow,因而第一次订阅时会先获得默许值
3.StateFlow仅在值googleplay安卓版下载已更新,而且值产生了改动时才会回来,即假定更新后的值没有改动,也没会回调Collect方法,这点与Ljava言语ive安全期计算器Data不同

StateFlow相似,咱们也能够用stateIn将普kotlin和java通流转化成SharedFlow安全

val result: StateFlow<Result<UiState>&gtgoogle翻译; = someFlow
.skotlin实战tateIn(
scope = viewModelScope,
started = WhileSubscribedJava(5000),
initialValue = Result.Loading
)

shareIn相似,仅有不同的时需求传入一个默许值
一起之所以WhileSubjava言语scribe架构师薪酬一月多少d中传入了5000,是为了完毕等候5秒后依然没有订阅者存在就中止协程的功用,这个方法有以下功用

  • 用户将您的运用转至后台工作,5 秒钟后一切来自其他kotlin协程原理google地球的数据更新会接连,这样能够节省电量。
  • 最新的数据依然会被缓存,所以当用户切换回运用时,视图当即就能够得到数据进行烘托。
  • 订阅将被重启,新数据会填充进来安全期是哪几天,当数据可用时更新视图。
  • 在屏幕旋转时,由于从头订阅的时刻在5s内,因kotlin极简教程此上游流不会接连

4.3 在页面中查询StateFlow

LiveData相似,咱们也需求常常在页面中查询StateFlow
查询StateFlow需求在协程中,因而咱们需求协程构建器,一般咱们会运用下面几种

  1. lifec安全ycleScope.launch : 当即建议协程,而且在本 ActivityFragment 销毁时完毕协程。
  2. LaunchWhenStagoogle服务结构rtedLaunchWhenResumed,它会在lifecycleOwner进入X状况之前一向等候,安全教育渠道又在脱离X状况时挂起协程

官方举荐 Flow 替代 LiveData,有必要吗?
如上图所示:
1kotlin言语.运用launch是不安全的,在运用在后台时也会接收数据更新,或许kotlin协程原理会导致运用溃散
2.运用launchWhenStartedlaunchWhenResumed会好一些,在后台时不会接收数据更新,可是,上游数据流会在运用后台工作期间坚持生动kotlin面试题,因而或许java言语浪费必定的资源

这么说来,咱们运用WhileSubscribed进行的装备岂不是无效了吗?订阅者一向存在,只需页面关闭时才会撤消订阅
官方举荐repeatOgoogle空间nLifecycle来构建协程
在某个特定的状况满足安全出产法时建议协程,而且在生命周期一切者退出该状况时接连协程,如下图所示。
官方举荐 Flow 替代 LiveData,有必要吗?
比方在某个Fragment的代码中:

onCreate安全工程View(...) {
vijava开发ewLifecycleOwner.lifecycleScope.launch {
viewLjava初学ifecycleOwner.lifecycle.repeatOnLifecycle(STAgoogle服务结构RTED) {
myViewModel.myUiSt安全出产法ate.collect { ... }
}
}Google
}

当这个Fragment处于安全教育渠道登录STARTED状况时会开始搜集流,而且在RESUMED状况时坚持搜集,毕竟在Fragment进入STOPPED状况时完毕搜集进程。
结合运用repeatOnLifecycle APIWhileSubscribed,能够帮助您的运用妥善运用设备资源的一起,发挥最佳功用

4.4 页面中查询Flow的最google服务结构佳方法

经过ViewModel显露数据,并在页面中获取的最佳方法是:

  • ✔️ 运用带超时参数的 WhileSubscribed 战略显露googleplay安卓版下载 Flow。示例 1
  • ✔️ 运用 repeatOnLifecycle 来搜集数据更新。示例 2

官方举荐 Flow 替代 LiveData,有必要吗?
最佳实践如上图所示,假定选用其他方法,上游数据流会被一向坚持生动,导致资源浪费安全
当然,假定您并不需求运用到Kotlin Flow的强健功java初学用,就用LiveData好了 :)

5 StateFlowSharedFlow有什么差安全教育异?

从上文其实能够看出,StateFlowSharedFlow其实是挺像的,让人有些傻傻分不清,安全教育渠道有时分也挺难选择该用哪个的

咱们总结一下,它们的差java作业培训班异如下:

  1. SharedFlow装备更为灵活,支撑装备replay,缓冲区巨细等,StateFlowSharedFlow的特化版别,replay架构图定为1,缓冲区巨细默许为0
  2. StateFlowLiveData相似,支撑经过myFlow.value获取当时状况,假定有这个需求,有必要运用StateFlow
  3. SharedFlow支撑发出和搜集重复值,而StateFlokotlin和javaw安全工程value重复时,不会回调collect
  4. 关于新的订阅者,安全期是哪几天StateFlow只会重播当时最新值,SharedFlow可装备重播元素个数(默许为0,即不重播)

能够看googleplay安卓版下载出,StateFlow为咱们做了一些默许的装备,在SharedFlow上添加了一些默许捆绑,这些装备或许并java作业培训班不契合咱们的要求

  1. 它疏忽重复的值,而且是不行Google装备的。这会带来一些问题,比方当往List中添加元素并更新时,StateFlow会以为是重复的值并疏忽
  2. 它需java初学求一个初始值,而且在开始订阅时会回调初始值,这有或许不是咱们想要的
  3. 它默许是粘性的,新用户kotlin实战订阅会获得当时的最新值,而且是不行装备java模拟器的,而SharedFlow能够修改replay

StateFlow施加在SharedFlow上的捆绑或许不是最适合您,假定不需求访问myFlow.value,而且享用SharedFlow的灵活性,能够选择考虑运用SharedFlow

总结

简略往往意味着不行强健,而强健又常常意味着杂乱,两者往往不能兼得,软件开发进程中常常面对这种取舍。
LiveData的简略并不是它的缺点,而是它的特征。StateFlowShar架构是什么意思edFlow更加强健,可是学习本钱也显着的更高.
咱们应该google地球根据自己的需求合理选择组件的运用

  1. 假定你的java面试题数据流比较简略,不需求进行线程切换与杂乱的数据改换,LiveDajava开发ta对你来说信赖现已足够了
  2. 假定你的数据流比较杂乱,需求切换线程等操作,不需求发送重复值,需求获取myFlow.valueStateFkotlin言语low对你来说是个好的选择
  3. 假定你的数据流比较杂乱,一起不需求获取myFlow.vjava模拟器alue,需求配安全教育渠道登录进口备新用户订阅重播无素的个数,或许需求发送重复的值,能够考虑运用Sharjava难学吗edFlow

参考资料

Google 举荐在 MVVM 架构中运用 Kotlin Flow
Migrate from LiveData tgoogle浏览器o StateFlow and SharedFlow
从 LiveData 迁移到 Kotlin 数据流
关于kotlin中的Collections、Sgoogle服务结构equence、Channel和Flow (二)