LiveData 數(shù)據(jù)倒灌:別問超凳,問就是不可預(yù)期

前言

很高興見到你诵冒!我是《Jetpack MVVM Best Practice》作者 KunMinX逗宜。

今天提到的 “數(shù)據(jù)倒灌” 一詞同波,是我為了方便理解和記憶 “頁面在 ‘二進(jìn)宮’ 時收到舊數(shù)據(jù)推送” 的情況允懂,而在 2019 年 自創(chuàng)并在網(wǎng)上傳播的 對此類現(xiàn)象的概括厕怜。

它主要發(fā)生在:通過 SharedViewModel + LiveData 的組合 來解決頁面通信的場景。

本文的目標(biāo)

由于本文的目標(biāo)主要是來介紹 官方 Demo 現(xiàn)有解決方案的缺陷,以及經(jīng)過 1 年迭代的完美解決方案粥航,

所以我假設(shè)在座的諸位 對最基本的背景緣由有一定的了解琅捏,知道:

為什么 LiveData 默認(rèn)被設(shè)計為粘性事件

為什么 官方文檔 推薦使用 SharedViewModel + LiveData(文檔沒明說,但事實上包含三個關(guān)鍵的背景緣由)

乃至為什么存在 “數(shù)據(jù)倒灌” 的現(xiàn)象

以及為什么在 “頁面通信” 的場景下递雀,不用靜態(tài)單例柄延、不用 LiveDataBus

如果對于這些前置知識也尚不了解,可結(jié)合個人興趣前往《LiveData 數(shù)據(jù)倒灌 背景緣由全貌 獨家解析》查閱缀程,此處不再累述搜吧。

現(xiàn)有解決方案及各自缺陷

《Jetpack MVVM 精講》中我分別提到了 Event 事件包裝器、反射方式杨凑、SingleLiveEvent 這三種方式來解決 “數(shù)據(jù)倒灌” 的問題滤奈。它們分別來自上文我們提到的外網(wǎng)美團(tuán)的文章撩满,和官方最新 demo蜒程。

但正如我在《Jetpack MVVM 精講》介紹的,它們分別存在如下問題:

Event 事件包裝器:

對于多觀察者的情況伺帘,只允許第一個觀察者消費昭躺,這不符合現(xiàn)實需求;

而且手寫 Event 事件包裝器伪嫁,在 Java 中存在 null 安全的一致性問題领炫。

·

反射干預(yù) Version 的方式:

存在延遲,無法用于對實時性有要求的場景礼殊;

并且數(shù)據(jù)會隨著 SharedViewModel 長久滯留在內(nèi)存中得不到釋放驹吮。

·

官方最新 demo 中的 SingleLiveEvent:

是對 Event 事件包裝器 一致性問題的改進(jìn),但未解決多觀察者消費的問題晶伦;

而且額外引入了消息未能從內(nèi)存中釋放的問題碟狞。

UnPeekLiveData 特點

UnPeekLiveData 通過 獨創(chuàng)的 “延時自動清理消息” 的設(shè)計,來滿足:

1.消息被分發(fā)給多個觀察者時婚陪,不會因第一個觀察者消費了而直接被置空

2.時限到了族沃,消息便不再會被倒灌

3.時限到了,消息自動從內(nèi)存中清理釋放

4.使非入侵的設(shè)計成為可能泌参,并最終結(jié)合官方 SingleLiveEvent 的設(shè)計實現(xiàn)了 遵循開閉原則的非入侵重寫脆淹。

并且 UnPeekLiveData 提供了構(gòu)造器模式,可通過構(gòu)造器組裝適合自己業(yè)務(wù)場景的 UnPeekLiveData沽一。

零入侵設(shè)計 延時自動清理消息 Builder 構(gòu)造器

PS:非常感謝近期 hegaojian盖溺、Angki、Flynn铣缠、Joker_Wan 等小伙伴積極的試用和反饋烘嘱,使得未被覺察的問題 被及時發(fā)現(xiàn)和納入考慮昆禽。

JCenter 依賴

詳見 GitHub:https://github.com/KunMinX/UnPeekLiveData

License

本文以 CC 署名-非商業(yè)性使用-禁止演繹 4.0 國際協(xié)議 發(fā)行。

Copyright ? 2019-present KunMinX

文中提到的 對 “數(shù)據(jù)倒灌” 一詞及其現(xiàn)象的概括蝇庭、對 Event 事件包裝器醉鳖、反射方式、SingleLiveEvent 各自存在的缺陷的理解哮内,以及對 UnPeekLiveData 的 “延遲自動清理消息” 的設(shè)計盗棵,均屬于本人獨立原創(chuàng)的成果,本人對此享有所有權(quán)和最終解釋權(quán)北发。

當(dāng)您借鑒或引用本文的引言纹因、思路、結(jié)論進(jìn)行二次創(chuàng)作琳拨,或全文轉(zhuǎn)載時辐怕,須注明鏈接出處,否則我們保留追責(zé)的權(quán)利从绘。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市是牢,隨后出現(xiàn)的幾起案子僵井,更是在濱河造成了極大的恐慌,老刑警劉巖驳棱,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件批什,死亡現(xiàn)場離奇詭異,居然都是意外死亡社搅,警方通過查閱死者的電腦和手機(jī)驻债,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來形葬,“玉大人合呐,你說我怎么就攤上這事◇弦裕” “怎么了淌实?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長猖腕。 經(jīng)常有香客問我拆祈,道長,這世上最難降的妖魔是什么倘感? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任放坏,我火速辦了婚禮,結(jié)果婚禮上老玛,老公的妹妹穿的比我還像新娘淤年。我一直安慰自己钧敞,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布互亮。 她就那樣靜靜地躺著犁享,像睡著了一般。 火紅的嫁衣襯著肌膚如雪豹休。 梳的紋絲不亂的頭發(fā)上炊昆,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天,我揣著相機(jī)與錄音威根,去河邊找鬼凤巨。 笑死,一個胖子當(dāng)著我的面吹牛洛搀,可吹牛的內(nèi)容都是我干的敢茁。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼留美,長吁一口氣:“原來是場噩夢啊……” “哼彰檬!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起谎砾,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤逢倍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后景图,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體较雕,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年挚币,在試婚紗的時候發(fā)現(xiàn)自己被綠了亮蒋。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡妆毕,死狀恐怖慎玖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情设塔,我是刑警寧澤凄吏,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站闰蛔,受9級特大地震影響痕钢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜序六,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一任连、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧例诀,春花似錦随抠、人聲如沸裁着。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽二驰。三九已至,卻和暖如春秉沼,著一層夾襖步出監(jiān)牢的瞬間桶雀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工唬复, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留矗积,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓敞咧,卻偏偏與公主長得像棘捣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子休建,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,728評論 2 351