前言
很高興見到你诵冒!我是《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)利从绘。