Jetpack 之 ViewModel 原理

ViewModel 源碼分析

入口

四種方式創(chuàng)建ViewModel,最終生成ViewModelStore進(jìn)行存儲(chǔ)

nameViewModel = new ViewModelProvider.NewInstanceFactory().create(NameViewModel.class);
nameViewModel = ViewModelProvider.AndroidViewModelFactory.getInstance(getApplication()).create(NameViewModel.class);
nameViewModel = new ViewModelProvider(this).get(NameViewModel.class);
nameViewModel = ViewModelProviders.of(this).get(NameViewModel.class);

ViewModelProvider

分為兩個(gè)分支,第一次和非第一次流程

第一次

ComponentActivity#getViewModelStore
---> (為空)Activity#getLastNonConfigurationInstance
---> Activity#NonConfigurationInstances(第一次為null)
---> new ViewModelStore()

非第一次

直接返回ViewModelStore

獲取實(shí)例內(nèi)容

get(NameViewModel.class)

分為兩個(gè)分支,第一次和非第一次流程

第一次

get(NameViewModel.class)
---> 第一次ViewModel為空
---> ViewModelProvider#create
---> SavedStateViewModelFactory#create
---> create
---> 反射構(gòu)造方法,ViewModelProvider->newInstance
---> 反射實(shí)例NameViewModel

ViewModelProvider#create 多個(gè)實(shí)現(xiàn)

SavedStateViewModelFactory#create
AbstractSavedStateViewModelFactory#create
NavControllerViewModel#create
ViewModelProvider#AndroidViewModelFactory#create
ViewModelProvider#NewInstanceFactory#create
NavControllerViewModel#create
LoaderManagerImpl#LoaderViewModel#create
FragmentManagerViewModel#create

非第一次

直接返回ViewModel<實(shí)例>

旋轉(zhuǎn)屏幕配置等邏輯--onRetainCustomNonConfigurationInstance存儲(chǔ)


(旋轉(zhuǎn)屏幕)LocalActivityManager#dispatchRetainNonConfigurationInstance
---> ComponentActivity#onRetainNonConfigurationInstance
---> Activity
---> NonConfigurationInstances#activity(持有ViewModelStore)

ComponentActivity#NonConfigurationInstances,存custom和viewstore

清理ViewModelStore邏輯

CommponentActivity()構(gòu)造方法 
---> getLifeCycle.addObserver 添加觀察者
---> onDestroy 邏輯
        ---> 未改變轉(zhuǎn)屏配置!isChangingConfigurations 情況下----> 清理ViewStore
       ---->isChangingConfigurations轉(zhuǎn)屏--->不清理生么也不操作

追蹤到AMS

前面已經(jīng)追蹤到調(diào)用方:

LocalActivityManager#dispatchRetainNonConfigurationInstance

繼續(xù)向上追蹤代碼,會(huì)看到Binder

(Binder)LocakActivityRecord

onRetainNonConfigurationInstance

ViewModel.png

實(shí)際上,如果Activity不銷毀的話,AMS存在ViewModel的副本作為緩存。

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

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

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