前言:在上一年的这个时候,谷歌官方引荐运用 Flow 替代LiveData,一年时刻过去了,我信任仍是有许多android开发的朋友和我一样有以下几个问题:Android开发人员需要从 LiveData 迁移到 Kotlin Flows 吗?LiveData 现在是否已弃用?
官方文档:developer.android.google.cn/kotlin/flow
引荐阅读:zhuanlan.zhihu.com/p/139582669
引荐阅读:/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 缓存封装
…..
我正在参加技能社区创作者签约方案招募活动,点击链接报名投稿。