Android Component Framework為我們解決了一些繁瑣的問題倚聚,并勾勒出Android App開發(fā)的合理框架瞧省。也可以說是一種官方推薦的標(biāo)準(zhǔn)范式盔性,使用這種范式編碼械媒,我們可以構(gòu)建出可展性更強(qiáng)蛀骇,邏輯更為清晰的App。因而在使用該種范式之前荧呐,我們有必要弄清楚該框架的設(shè)計(jì)思路汉形。同時(shí)我們也應(yīng)該高度重視框架給出的開發(fā)理念。的確倍阐,是一些基本的概疆,核心的理念指導(dǎo)或者誤導(dǎo)著我們的編碼
1.ViewModel的設(shè)計(jì)意圖是什么?
在官方給出的指導(dǎo)中峰搪,Actvity是作為一個(gè)自我封閉的系統(tǒng)組件而存在的岔冀,組件通信通過Intent,組件之間應(yīng)該解耦合概耻,最重要的是組件之間的跳轉(zhuǎn)都是通過系統(tǒng)服務(wù)處理的使套。嚴(yán)格意義上說,組件之間是并不直接溝通的鞠柄。這就會(huì)使得侦高,組件之間的數(shù)據(jù)也應(yīng)該是自我封閉的。舉一個(gè)很簡單的用例厌杜,ListActivity呈現(xiàn)一個(gè)日程列表奉呛,點(diǎn)擊條目跳轉(zhuǎn)到DetailActivity,在此可以編輯保存夯尽。就一般的做法瞧壮,我們會(huì)把所選的條目信息放入Intent,傳入DetailActivity,這也是標(biāo)準(zhǔn)做法匙握。通過這種方式傳遞數(shù)據(jù)咆槽,就表明數(shù)據(jù)在兩個(gè)Activity之間是獨(dú)立的。即使在DetailActivity重新編輯了條目肺孤,數(shù)據(jù)的改變也不會(huì)如實(shí)反映到ListActivity上去。原因何在济欢?就是數(shù)據(jù)獨(dú)立導(dǎo)致的赠堵。
Android官方文檔在講解Activity時(shí),著重強(qiáng)調(diào)了生命周期法褥,以及對(duì)每個(gè)狀態(tài)執(zhí)行何種操作給出了指導(dǎo)茫叭。但是并沒有避免程序員將大部分代碼邏輯放在Activity中。在最新的Android Component Frame的指導(dǎo)文檔中半等,Android Team強(qiáng)調(diào)了非常重要的觀點(diǎn)--Activity只是系統(tǒng)與App溝通的窗口揍愁,系統(tǒng)隨時(shí)可以銷毀掉Activity呐萨,因而將代碼邏輯放到Activity中是不可取的。也可以說Activity并不擁有數(shù)據(jù)莽囤,它只是負(fù)責(zé)接受數(shù)據(jù)變化谬擦,并通知UI跟新。
說到這里也應(yīng)該引出這篇文章的主角ViewModel了朽缎。ViewModel處理業(yè)務(wù)邏輯惨远,并在屏幕旋轉(zhuǎn),Activity被銷毀重建的時(shí)候话肖,依然存在北秽。
2.ViewModel源碼解析
ViewModel組件的源碼相當(dāng)簡單,它的目的就是建立一個(gè)UI和數(shù)據(jù)的隔離帶最筒。ViewModel為Activity或Fragment提供數(shù)據(jù)訪問接口贺氓,同時(shí)將UI層的指令傳遞給數(shù)據(jù)層。簡單點(diǎn)說床蜘,ViewModel組件的源碼就是圍繞如何獲取一個(gè)ViewModel來寫的辙培。ViewModelProviders.of獲取ViwModelProvider,ViewModelProvider.get獲取ViewModel悄泥。其中ViewModel的構(gòu)造方式可以由ViewModelProviders.of的Factory參數(shù)自行定義虏冻。support包中的AppCompatActivity已經(jīng)整合了LifeCycle和ViewModel組件。