前言:在去年的这个时候,谷歌官网举荐应用 Flow 代替 LiveData,一年工夫过来了,我置信还是有很多 android 开发的敌人和我一样有以下几个问题:Android 开发人员须要从 LiveData 迁徙到 Kotlin Flows 吗?LiveData 当初是否已弃用?
🌟官网文档:https://developer.android.goo…
🌟举荐浏览:https://zhuanlan.zhihu.com/p/…
🌟举荐浏览:https://juejin.cn/post/697900…
通过浏览本文你能理解到或学到什么:
- ①
Flow
,Shared flow
&State flow
的应用(具体操作本文就不多说了,给大家举荐好文) - ②
SharedFlow
和StateFlow
,它们也有本人的可变类型——MutableSharedFlow
和MutableStateFlow
,比照LiveData
我到底用哪一个? - ③咱们曾经有了
Flow
,为啥还会有SharedFlow
、StateFlow
,Flow
不够用吗? - ④我要迁徙到
Flow
吗?
有人问:LiveData 是不是真的快要被废除了。LiveData:你是成心找茬?
我要迁徙到 Flow 吗?
咱们先来答复这个大家最关怀的问题
🚀论断:如果 LiveData 满足您的需要,那么就不急于替换它,如果是一个新我的项目,举荐在 UI 中用 LiveData,在 Repo 层 中用 Flow。
上面请观赏 RxJava
与LiveData
&Flow
的爱恨情仇:
在 2017 年之前,大家都是应用 RxJava
去配合 Retrofit
实现网络申请,RxJava 实现事件订阅。然而,谁用谁晓得 (真的简单,各种线程的切换,头脑爆炸,不过,当初用协程就能够啦😻)。因为是真的简单,对大部分开发者不是很敌对,于是在 2017 年那样的环境下,谷歌推出了 LiveData
。然而LiveData
的性能却齐全能够应用 RxJava
来实现,那么谷歌为啥还要费那么大劲整这么个库进去呢?当然是因为 LiveData
比较简单啦~(而且 RxJava
不是谷歌本人的货色,谷歌:我可不想当大冤种😂)。于是在之后的一段时间中,对于简略场景大家开始应用 LiveData
了,对于简单的场景大家还是在应用 RxJava
。因为LiveData
驾驭不了简单场景啊。(LiveData
: 我太难了😭)。不过好在,Flow 呈现了。Flow:LiveData 老弟别怕,大哥给你撑腰来啦!(其实我来代替你来了,嘿嘿)至今,它们之间的爱恨情仇还在持续 …..
援用 扔物线(朱凯)大佬的话:协程的 Flow 和 RxJava 的性能范畴十分类似——其实我感觉就是一样的——然而 Flow 是协程里必不可少的一部分,而协程是 Kotlin 里必不可少的一部分,而 Kotlin 是 Android 开发里必不可少的一部分——哦这个说的不对,从新说——而 Kotlin 又是 Android 当初主推的开发语言以及将来的趋势,这样的话,Flow 一进去,那就没 LiveData 什么事了。别说 LiveData 了,当前 RxJava 也没什么事了。
LiveData 会被废除吗?
LiveData
会因为 Flow
而被废除吗?尽管官网始终在举荐应用 Flow
代替LiveData
,然而在 GDG 的社区中的答案和多位国内外的 GDE 口中的答案是:不会被废除!
起因有两点:
- 在简略的场景下应用
LiveData
曾经够了,而且LiveData
比较简单,上手快,RxJava
学习老本真的很高😭,Flow
也绝对没有那么简略。 Flow
是协程的货色,如果你用的是Java
来开发Android
,那么你没有方法应用Flow
。而且当初招聘平台至多有 50% 以上的 Android 岗位还在应用 Java,所以LiveData
不会被废除!
总结:如果不须要应用到 Kotlin 数据流的弱小性能,就用 LiveData
。Flow
是比 LiveData
更好,然而在特定的场景下 LiveData
更适合!
SharedFlow 和 StateFlow,比照 LiveData 我到底用哪一个?
外围:LiveData 实用于 MVVM,但不适用于 MVI
在 MVI
中,View
通过触发事件与 ViewModel
通信,而后在 ViewModel
的外部解决完这些事件后,收回新的 ViewState 并更新 UI。而且应用 LiveData
解决视图状态非常简单,能够同时用于 MVVM
和MVI
,然而当咱们想要像以前一样显示一个简略的 Snackbar 时问题就来了。如果咱们应用 LiveEvent
类,那么整个单向状态流就会受到烦扰,因为咱们只是在 ViewModel
中触发了一个事件来与 UI
交互,但它应该是相同的。而应用 StateFlow
和SharedFlow
则能够解决这个问题。
StateFlow
和 LiveData
有相似之处,两者都是可察看的数据持有者类,它们的不同在于 StateFlow
须要将初始状态传递给构造函数,而 LiveData
不须要。当视图进入 STOPPED
状态时,LiveData.observe()
会主动勾销注册消费者,而 StateFlow
不会主动进行收集。如果想要实现雷同的性能的话,须要在 Lifecycle.repeatOnLifecycle
中收集流。
SharedFlow
和 StateFlow
之间的次要区别在于,StateFlow
通过构造函数获取一个默认值,并在有人开始收集时便立刻收回,而 SharedFlow
不承受任何值,默认状况下什么也不收回。
咱们曾经有了 Flow,为啥还会有 SharedFlow、StateFlow。Flow 不够用吗?
StateFlow 和 SharedFlow 是 Flow API,它们使流可能以最佳的形式收回状态更新,并向多个消费者收回音讯。
单单一个 Flow 当然是不够的啦
Flow
是无状态的,它没有 .value属性。它只是一个能够收集的数据流。Flow
是申明性的(冷流)。它仅在收集时实现,并且对于每个新收集器都会创立一个新流。对于拜访数据库和其余不用每次都反复的操作,这不是一个好的抉择。Flow
原本是不晓得Android
的生命周期,然而起初能够通过向LifecycleCoroutineScope
增加扩大办法launchWhenStarted
来解决,但大多数人不晓得如何正确应用它。而且因为Flow
有一个订阅计数属性,当Lifecycle.Event
达到ON_STOP
时该属性不会扭转。这意味着Flow
将在内存中依然处于活动状态,就会可能导致内存透露!
想要学会如何应用 Flow?那你能够来看看这些文章
有小伙伴说看不懂 LiveData、Flow、Channel,跟我走 —— Jetpack 系列(4)— 文章起源掘金 丨大麦
从 LiveData 迁徙到 Kotlin 数据流 — 文章起源掘金 Android_开发者
Android 架构之 MVI 高级体 | Flow 替换 LiveData 重构数据链路 — 文章起源掘金唐子玄
尾述
看完这篇文章,置信你的心中曾经有了属于本人的答案。还是那句话,不肯定要最好的,然而要最合适的!因为我自己能力也无限,文章也是在浏览了网上的大量文章后和几位 Android 开发者一起探讨进去的,文章有不对的中央欢送指出,有问题欢送在评论区留言探讨~
对于我
Hello,我是 Taxze,如果您感觉文章对您有价值,心愿您能给我的文章点个❤️,也欢送关注我的博客。
如果您感觉文章还差了那么点货色,也请通过 关注 督促我写出更好的文章——万一哪天我提高了呢?😝
根底系列:
2022 · 让我带你 Jetpack 架构组件从入门到精通 — Lifecycle
学会应用 LiveData 和 ViewModel,我置信会让你在写业务时变得轻松🌞
当你真的学会 DataBinding 后,你会发现“这玩意真香”!
Navigation — 这么好用的跳转治理框架你确定不来看看?
Jetpack Room — 给你一种新的数据库操作体验!
以下局部还在码字,连忙点个珍藏吧🔥
2022 · 让我带你 Jetpack 架构组件从入门到精通 — Paging3
2022 · 让我带你 Jetpack 架构组件从入门到精通 — WorkManager
2022 · 让我带你 Jetpack 架构组件从入门到精通 — ViewPager2
2022 · 让我带你 Jetpack 架构组件从入门到精通 — 登录注册页面实战(MVVM)
进阶系列:
一年工夫过来了,LiveData 真的被 Flow 代替了吗?(本文🌟)
协程 + Retrofit 网络申请状态封装
Room 缓存封装
…..