一剑鞍、ViewModel使用
如圖1,ViewModel使用很簡(jiǎn)單抓韩,只用將類(lèi)繼承ViewModel類(lèi)即可
如圖2巍扛,在Activity里面只要使用ViewModelProvider get方法就可以得到對(duì)應(yīng)的ViewModel實(shí)例
二、 ViewModel的作用
1腹侣、當(dāng)Activity叔收、Fragment因?yàn)榕渲庙?xiàng)發(fā)生改變重新生成時(shí),界面數(shù)據(jù)就會(huì)丟失傲隶,盡管可以使用onSaveInstanceState()保存數(shù)據(jù)饺律,但此方法僅適合可以序列化再反序列化的少量數(shù)據(jù),而不適合數(shù)量可能較大的數(shù)據(jù)跺株,如用戶(hù)列表或位圖复濒。而ViewModel可以很好地處理該情況下數(shù)據(jù)地保存。
2帖鸦、當(dāng)不同F(xiàn)ragment想公用一套Activity的數(shù)據(jù)時(shí)芝薇,ViewModel可以很好地支持這種情況。
3作儿、ViewModel簡(jiǎn)化了Activity洛二、Fragment的處理邏輯,使整個(gè)框架更加優(yōu)美攻锰。
三晾嘶、 ?ViewModel的原理
ViewModel為什么會(huì)產(chǎn)生如上所說(shuō)的作用呢,下面我們就從源碼開(kāi)始進(jìn)行分析娶吞。如下垒迂,ViewModelProvider構(gòu)造函數(shù)傳入的為ViewModelStoreOwner實(shí)例。
這個(gè)實(shí)例是什么呢妒蛇,如圖4其實(shí)就是一個(gè)接口机断,里面只有一個(gè)方法就是獲取ViewModelStore類(lèi)的實(shí)例
如圖5,就是ViewModel的容器
下面來(lái)看看ViewModel的實(shí)例怎么產(chǎn)生的吧绣夺,如圖6吏奸,ViewModel實(shí)例先從viewModelStore緩存中去取,如果取不到再去新建陶耍,現(xiàn)在只要弄清viewModelStore
從哪里來(lái)奋蔚,那么所有的謎團(tuán)就解開(kāi)了。ComponentActivity里面實(shí)現(xiàn)了ViewModelStoreOwner接口,可以看出mViewModelStore首先會(huì)從getLastNonConfigurationInstance配置類(lèi)中去獲取泊碑,顧名思義坤按,這個(gè)類(lèi)是和配置無(wú)關(guān)的類(lèi)。
關(guān)于這個(gè)變量的賦值是發(fā)生在Activity attach里面馒过。至于賦值流程臭脓,我還未搞清,如大牛們有清楚的沉桌,請(qǐng)?jiān)谠u(píng)論區(qū)指教