RecyclerView Adapter系列之集成Lifecycle

為什么集成Lifecycle

Lifecycle幾乎已經(jīng)是Android開發(fā)的標準庫,如LiveData、ViewModel甚至協(xié)程,都有Lifecycle的擴展,毋庸置疑,我們集成它,一方面為了趕上潮流,順勢而為。另一方面為了更好的管理Adapter的數(shù)據(jù),我們都知道Adapter有個onDetachedFromRecyclerView方法,在Adapter從RecyclerView解綁的時候被調(diào)用,可你有沒有注意到一個細節(jié),在Activity的onDestroy后并沒有觸發(fā)onDetachedFromRecyclerView,反而是你主動調(diào)用RecyclerView.adapter = null 的時候才會被調(diào)用,所以說這也是我為什么要集成Lifecycle的重要原因。

如何集成呢?

這里為什么會有一個arrayLifeObservers呢?因為框架本身擴展了動畫,單選多選等功能,這樣就可以實現(xiàn)任何擴展的功能都可以監(jiān)聽到生命周期回調(diào),來看個例子

這就是我擴展的動畫列表,它是一個常量animationArray緩存,在當前頁面被onDestroy的時候,我為什么還要保留它呢?直接清理干凈就行了,這樣及時的釋放內(nèi)存。這也是為什么還要一個觀察者模式的原因

最后我們將LifecycleAdapter集成到框架里

這里有個細節(jié)說下,之前這個BaseAdapter叫ViewHolderCacheAdapter,被重構成了BaseAdapter,這樣有利于擴展繼承,在名字上更貼切。讓BaseAdapter繼承LifecycleAdapter,實現(xiàn)arrayLifeObservers

然后實現(xiàn)onStateChanged函數(shù),在ON_DESTROY的生命周期內(nèi)調(diào)用,recyclerView.adapter = null ,最后觸發(fā)onDetachedFromRecyclerView

然后釋放掉所有緩存和依賴

ViewModel 層也需要Lifecycle嗎?

答案:需要

當我們實現(xiàn)一個ViewModel的時候,難免會有一些緩存,這些緩存都存在ViewModel的對象里,在釋放的時候,我們完全可以全部清理掉,如圖:

這樣以來很容易被垃圾回收器回收,減少依賴,提高回收的效率,ViewModel的生命周期來源于哪里呢?請看圖

這里為什么用一個新的LifecycleViewModel呢?一方面因為開閉原則,一方面是接口隔離,這樣確實也很合理,然后讓DefaultViewModel實現(xiàn)LifecycleViewModel

最后,在ListAdapter的生命周期里回調(diào)ViewModel的onStateChanged即可,需要判斷ViewModel是否繼承自LifecycleViewModel,如果未繼承,則不需要處理

在ListAdapter中重載BaseAdapter的onStateChange,在生命周期變化的過程中通知ViewModel就行了,你是不是想問,Adapter什么時候添加到生命周期觀察的呢?

在之前的動態(tài)擴展into函數(shù)中,我們只需要加入這樣一段代碼就可以了,是不是很簡單。這樣做的目的也是為了保持框架的擴展性,沒有實現(xiàn)LifecycleAdapter也同樣可以調(diào)用我們的擴展,并且不會出現(xiàn)問題。

總結

好了,生命周期的集成就是這樣,希望對你有幫助。

項目地址

https://github.com/ibaozi-cn/RecyclerViewAdapter

作者

i校長

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

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