ViewModel解析

1. 使用

MyViewModel

2. 作用

i. 保存Activity/Fragment中的數(shù)據(jù)
ii. 生命周期作用于Activity/Fragment之外,在使用時(shí)創(chuàng)建,在Activity/Fragment銷(xiāo)毀時(shí)自動(dòng)清空數(shù)據(jù)
iii. 在翻轉(zhuǎn)屏幕時(shí)數(shù)據(jù)不丟失
iv. 協(xié)程Scope
v. 生命周期


ViewModel生命周期

3. 原理

ViewModel時(shí)序圖
  • ViewModelProvider是一個(gè)供外部操作的類(lèi)。
  • ViewModelStore內(nèi)部其實(shí)是一個(gè)HashMap,用來(lái)存儲(chǔ)ViewModel,key為 DEFAULT_KEY+ ”:“+getCanonicalName() 例如為 androidx.lifecycle.ViewModelProvider.DefaultKey : com.wuba.acm.leetcode.Solution,value即為ViewModel。
  • 當(dāng)沒(méi)有ViewModel的時(shí)候,調(diào)用Factory去創(chuàng)建對(duì)象,注意:默認(rèn)的Factory是只會(huì)創(chuàng)建沒(méi)有構(gòu)造函數(shù)的對(duì)象的,如果你的ViewModel有構(gòu)造函數(shù),需要自定義實(shí)現(xiàn)Factory。
  • 在需要ViewModel的時(shí)候,F(xiàn)ragmentActivity會(huì)創(chuàng)建ViewModelStroe,在Activity結(jié)束時(shí),也會(huì)調(diào)用ViewModelStore的clear方法清空對(duì)象。
  • 在翻轉(zhuǎn)屏幕時(shí)其實(shí)并沒(méi)有威脅到ViewModelStore的存在,我們知道屏幕翻轉(zhuǎn)時(shí)的生命周期為onPause->onStop->onDestroy->onCreate->onStart->onResume,唯一能使ViewModelStore清空的只有onDestroy方法,但是在detroy里面其實(shí)是有特殊處理的,F(xiàn)ragmentActivity會(huì)調(diào)用isChangingConfigurations()判斷Activity是否是翻轉(zhuǎn)還是finish,從而保證數(shù)據(jù)不被清理掉。
  • 在FragmentActivity中也通過(guò) NonConfigurationInstances 處理了界面異常關(guān)閉,注意:普通的ViewModel并不能處理onStavedInstance方法保存的數(shù)據(jù),請(qǐng)參考SavedStateViewModel
    進(jìn)行處理。

ViewModel 使用及原理解析

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

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