前言:在上一年的这个时候,谷歌官方引荐运用 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的运用(具体操作本文就不多说了,给咱们引荐好文)
  • SharedFlowStateFlow,它们也有自己的可变类型——MutableSharedFlowMutableStateFlow,对比LiveData我究竟用哪一个?
  • ③咱们现已有了Flow,为啥还会有SharedFlowStateFlowFlow不行用吗?
  • ④我要迁移到Flow吗?

有人问:LiveData是不是真的快要被抛弃了。LiveData:你是成心找茬?

我要迁移到Flow吗?

咱们先来回答这个咱们最关怀的问题

定论:假如 LiveData 满意您的需求,那么就不急于替换它,假如是一个新项目,引荐在 UI 顶用 LiveData,在Repo层 顶用 Flow。

下面请欣赏RxJavaLiveData&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 数据流的强壮功用,就用 LiveDataFlow是比LiveData更好,可是在特定的场景下LiveData更合适!

SharedFlow 和 StateFlow,对比LiveData我究竟用哪一个?

核心:LiveData 适用于 MVVM,但不适用于 MVI

MVI中,View经过触发事情与ViewModel通信,然后在ViewModel的内部处理完这些事情后,宣布新的ViewState并更新UI。并且运用LiveData处理视图状况非常简略,能够一起用于MVVMMVI,可是当咱们想要像曾经一样显现一个简略的Snackbar时问题就来了。假如咱们运用LiveEvent类,那么整个单向状况流就会受到干扰,由于咱们只是在ViewModel中触发了一个事情来与UI交互,但它应该是相反的。而运用StateFlowSharedFlow则能够处理这个问题。

StateFlowLiveData 有类似之处,两者都是可观察的数据持有者类,它们的不同在于StateFlow需要将初始状况传递给构造函数,而 LiveData 不需要。当视图进入 STOPPED 状况时,LiveData.observe() 会主动取消注册顾客,而 StateFlow不会主动停止搜集。假如想要完成相同的功用的话,需要在Lifecycle.repeatOnLifecycle中搜集流。

SharedFlowStateFlow 之间的主要差异在于,StateFlow 经过构造函数获取一个默认值,并在有人开端搜集时便立即宣布,而 SharedFlow 不接受任何值,默认情况下什么也不宣布。

咱们现已有了Flow,为啥还会有SharedFlow、StateFlow。Flow不行用吗?

StateFlow 和 SharedFlow 是 Flow API,它们使流能够以最佳的方法宣布状况更新,并向多个顾客宣布消息。

单单一个Flow当然是不行的啦

  1. Flow是无状况的,它没有 .value特点。它只是一个能够搜集的数据流。
  2. Flow是声明性的(冷流)。它仅在搜集时完成,并且关于每个新搜集器都会创立一个新流。关于拜访数据库和其他不用每次都重复的操作,这不是一个好的挑选。
  3. 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 缓存封装

…..

我正在参加技能社区创作者签约方案招募活动,点击链接报名投稿。