一年時間過去了,LiveData真的被Flow代替了嗎? LiveData會被廢棄嗎?

前言:在去年的這個時候,谷歌官方推薦使用 Flow 替代LiveData,一年時間過去了,我相信還是有很多android開發(fā)的朋友和我一樣有以下幾個問題:Android開發(fā)人員需要從 LiveData 遷移到 Kotlin Flows 嗎?LiveData 現(xiàn)在是否已棄用?

??官方文檔:https://developer.android.google.cn/kotlin/flow

??推薦閱讀:https://zhuanlan.zhihu.com/p/139582669

??推薦閱讀:https://juejin.cn/post/6979008878029570055

通過閱讀本文你能了解到或?qū)W到什么:

  • Flow, Shared flow & State flow的使用(具體操作本文就不多說了,給大家推薦好文)
  • SharedFlowStateFlow,它們也有自己的可變類型——MutableSharedFlowMutableStateFlow,對比LiveData我到底用哪一個?
  • ③我們已經(jīng)有了Flow,為啥還會有SharedFlow、StateFlowFlow不夠用嗎?
  • ④我要遷移到Flow嗎?

有人問:LiveData是不是真的快要被廢棄了。LiveData:你是故意找茬?

我要遷移到Flow嗎?

我們先來回答這個大家最關(guān)心的問題

??結(jié)論:如果 LiveData 滿足您的需求,那么就不急于替換它,如果是一個新項目,推薦在 UI 中用 LiveData,在Repo層 中用 Flow。

下面請欣賞RxJavaLiveData&Flow的愛恨情仇:

在2017年之前,大家都是使用RxJava去配合Retrofit實現(xiàn)網(wǎng)絡(luò)請求,RxJava實現(xiàn)事件訂閱。但是,誰用誰知道 (真的復(fù)雜,各種線程的切換,頭腦爆炸,不過,現(xiàn)在用協(xié)程就可以啦??) 。因為是真的復(fù)雜,對大部分開發(fā)者不是很友好,于是在2017年那樣的環(huán)境下,谷歌推出了LiveData。但是LiveData的功能卻完全可以使用RxJava來實現(xiàn),那么谷歌為啥還要費那么大勁整這么個庫出來呢?當(dāng)然是因為LiveData比較簡單啦~(而且RxJava不是谷歌自己的東西,谷歌:我可不想當(dāng)大冤種??)。于是在之后的一段時間中,對于簡單場景大家開始使用LiveData了,對于復(fù)雜的場景大家還是在使用RxJava。因為LiveData駕馭不了復(fù)雜場景啊。(LiveData:我太難了??)。不過好在,F(xiàn)low出現(xiàn)了。Flow:LiveData老弟別怕,大哥給你撐腰來啦!(其實我來代替你來了,嘿嘿)至今,它們之間的愛恨情仇還在繼續(xù).....

引用 扔物線(朱凱)大佬的話:協(xié)程的 Flow 和 RxJava 的功能范圍非常相似——其實我覺得就是一樣的——但是 Flow 是協(xié)程里必不可少的一部分,而協(xié)程是 Kotlin 里必不可少的一部分,而 Kotlin 是 Android 開發(fā)里必不可少的一部分——哦這個說的不對,重新說——而 Kotlin 又是 Android 現(xiàn)在主推的開發(fā)語言以及未來的趨勢,這樣的話,F(xiàn)low 一出來,那就沒 LiveData 什么事了。別說 LiveData 了,以后 RxJava 也沒什么事了。

LiveData會被廢棄嗎?

LiveData會因為Flow而被廢棄嗎?雖然官方一直在推薦使用Flow代替LiveData,但是在GDG的社區(qū)中的答案和多位國內(nèi)外的GDE口中的答案是:不會被廢棄!

原因有兩點:

  • 在簡單的場景下使用LiveData已經(jīng)夠了,而且LiveData比較簡單,上手快,RxJava學(xué)習(xí)成本真的很高??,Flow也相對沒有那么簡單。
  • Flow 是協(xié)程的東西,如果你用的是Java來開發(fā)Android,那么你沒有辦法使用Flow。而且現(xiàn)在招聘平臺至少有50%以上的Android崗位還在使用Java,所以LiveData不會被廢棄!

總結(jié):如果不需要使用到 Kotlin 數(shù)據(jù)流的強大功能,就用 LiveDataFlow是比LiveData更好,但是在特定的場景下LiveData更合適!

SharedFlow 和 StateFlow,對比LiveData我到底用哪一個?

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

MVI中,View通過觸發(fā)事件與ViewModel通信,然后在ViewModel的內(nèi)部處理完這些事件后,發(fā)出新的ViewState并更新UI。而且使用LiveData處理視圖狀態(tài)非常簡單,可以同時用于MVVMMVI,但是當(dāng)我們想要像以前一樣顯示一個簡單的Snackbar時問題就來了。如果我們使用LiveEvent類,那么整個單向狀態(tài)流就會受到干擾,因為我們只是在ViewModel中觸發(fā)了一個事件來與UI交互,但它應(yīng)該是相反的。而使用StateFlowSharedFlow則可以解決這個問題。

StateFlowLiveData 有相似之處,兩者都是可觀察的數(shù)據(jù)持有者類,它們的不同在于StateFlow需要將初始狀態(tài)傳遞給構(gòu)造函數(shù),而 LiveData 不需要。當(dāng)視圖進入 STOPPED 狀態(tài)時,LiveData.observe() 會自動取消注冊消費者,而 StateFlow不會自動停止收集。如果想要實現(xiàn)相同的功能的話,需要在Lifecycle.repeatOnLifecycle中收集流。

SharedFlowStateFlow 之間的主要區(qū)別在于,StateFlow 通過構(gòu)造函數(shù)獲取一個默認值,并在有人開始收集時便立即發(fā)出,而 SharedFlow 不接受任何值,默認情況下什么也不發(fā)出。

我們已經(jīng)有了Flow,為啥還會有SharedFlow、StateFlow。Flow不夠用嗎?

StateFlow 和 SharedFlow 是 Flow API,它們使流能夠以最佳的方式發(fā)出狀態(tài)更新,并向多個消費者發(fā)出消息。

單單一個Flow當(dāng)然是不夠的啦

  1. Flow是無狀態(tài)的,它沒有 .value屬性。它只是一個可以收集的數(shù)據(jù)流。
  2. Flow是聲明性的(冷流)。它僅在收集時實現(xiàn),并且對于每個新收集器都會創(chuàng)建一個新流。對于訪問數(shù)據(jù)庫和其他不必每次都重復(fù)的操作,這不是一個好的選擇。
  3. Flow本來是不知道Android的生命周期,但是后來可以通過向LifecycleCoroutineScope添加擴展方法launchWhenStarted來解決,但大多數(shù)人不知道如何正確使用它。而且因為Flow有一個訂閱計數(shù)屬性,當(dāng)Lifecycle.Event達到ON_STOP時該屬性不會改變。這意味著Flow將在內(nèi)存中仍然處于活動狀態(tài),就會可能導(dǎo)致內(nèi)存泄漏!

想要學(xué)會如何使用Flow?那你可以來看看這些文章

有小伙伴說看不懂 LiveData、Flow、Channel,跟我走 —— Jetpack 系列(4) — 文章來源掘金 丨大麥

從 LiveData 遷移到 Kotlin 數(shù)據(jù)流 — 文章來源掘金Android_開發(fā)者

Android 架構(gòu)之 MVI 初級體 | Flow 替換 LiveData 重構(gòu)數(shù)據(jù)鏈路 — 文章來源掘金唐子玄

尾述

看完這篇文章,相信你的心中已經(jīng)有了屬于自己的答案。還是那句話,不一定要最好的,但是要最合適的!因為我本人能力也有限,文章也是在閱讀了網(wǎng)上的大量文章后和幾位Android開發(fā)者一起討論出來的,文章有不對的地方歡迎指出,有問題歡迎在評論區(qū)留言討論~

關(guān)于我

Hello,我是Taxze,如果您覺得文章對您有價值,希望您能給我的文章點個??,也歡迎關(guān)注我的博客。

如果您覺得文章還差了那么點東西,也請通過關(guān)注督促我寫出更好的文章——萬一哪天我進步了呢???

基礎(chǔ)系列:

2022 · 讓我?guī)鉐etpack架構(gòu)組件從入門到精通 — Lifecycle

學(xué)會使用LiveData和ViewModel,我相信會讓你在寫業(yè)務(wù)時變得輕松??

當(dāng)你真的學(xué)會DataBinding后,你會發(fā)現(xiàn)“這玩意真香”!

Navigation — 這么好用的跳轉(zhuǎn)管理框架你確定不來看看?

Jetpack Room — 給你一種新的數(shù)據(jù)庫操作體驗!

以下部分還在碼字,趕緊點個收藏吧??

2022 · 讓我?guī)鉐etpack架構(gòu)組件從入門到精通 — Paging3

2022 · 讓我?guī)鉐etpack架構(gòu)組件從入門到精通 — WorkManager

2022 · 讓我?guī)鉐etpack架構(gòu)組件從入門到精通 — ViewPager2

2022 · 讓我?guī)鉐etpack架構(gòu)組件從入門到精通 — 登錄注冊頁面實戰(zhàn)(MVVM)

進階系列:

一年時間過去了,LiveData真的被Flow代替了嗎?(本文??)

協(xié)程 + Retrofit網(wǎng)絡(luò)請求狀態(tài)封裝

Room 緩存封裝

.....

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容