首先感謝 JessYan 開(kāi)源的 MVPArms,學(xué)到了很多知識(shí),也方便了公司項(xiàng)目的開(kāi)發(fā)!
在 Google I/O 2017 大會(huì)上,Google 推出了新的組件庫(kù) - Android Architecture Components,官方文檔做的很詳細(xì),分別介紹了各個(gè)組件的應(yīng)用場(chǎng)景和使用方式,這無(wú)疑會(huì)推進(jìn) Android MVVM 模式的發(fā)展。關(guān)于 MVVM 這里不做過(guò)多介紹,如果有需要可以自行搜索。
正文
Android Architecture Components 簡(jiǎn)介
先來(lái)看一下 Android Architecture Components 包含哪些內(nèi)容:
加上之前推出的 Data Binding Library
如果想要引用 Components,可參考以下鏈接:
注意:如果你無(wú)法訪(fǎng)問(wèn) Google Maven 庫(kù),可以使用以下地址代替:
maven { url "https://dl.google.com/dl/android/maven2" }
這里需要特別說(shuō)明的是,ViewModel 相當(dāng)于 MVVM 的 VM 層,它和 View 是通過(guò) Data Binding 雙向綁定的,ViewModel 不再持有 View 的引用,而是存儲(chǔ)UI相關(guān)的數(shù)據(jù);而且 ViewModel 是生命周期感知的,當(dāng)創(chuàng)建它的 Activity/Fragment 銷(xiāo)毀時(shí),ViewModel 會(huì)自動(dòng)銷(xiāo)毀。
MVVMArms 框架圖
這里引用 官方 架構(gòu)圖,參考 MVPArms 做了一些修改。

整個(gè)框架采用 Dagger 進(jìn)行依賴(lài)注入,并使用了最新的 Dagger.Android,組織好 Module 和 Components,框架會(huì)自動(dòng)注入。具體可參考 demo。
MVVM 組件的封裝
Model
框架中,數(shù)據(jù)的獲取是通過(guò) Model 層獲取的,在 Model 中持有一個(gè)數(shù)據(jù)管理類(lèi)對(duì)象- RepositoryManager(實(shí)現(xiàn)了 IRepositoryManager 接口),分別可以通過(guò) Retrofit
獲取網(wǎng)絡(luò)數(shù)據(jù),通過(guò) Room 獲取 SQLite 數(shù)據(jù)庫(kù)中的持久化數(shù)據(jù)。具體實(shí)現(xiàn)可查看源碼鏈接:
Room 的使用需要在 gradle 中添加:
android {
...
//Room
javaCompileOptions {
annotationProcessorOptions {
arguments = ["room.schemaLocation":
"$projectDir/schemas".toString()]
}
}
}
ViewModel
ViewModel 是整個(gè)框架比較新穎和重要的部分,BaseViewModel 繼承于 Components 中的 AndroidViewModel,并實(shí)現(xiàn)了 LifecycleObserver 接口;它持有 Model 的引用,主要的業(yè)務(wù)邏輯都是在 ViewModel 中實(shí)現(xiàn)的;ViewModel 中UI相關(guān)的數(shù)據(jù)通過(guò) LiveData 包裝,使得當(dāng)數(shù)據(jù)變化時(shí),自動(dòng)反映到UI上,實(shí)現(xiàn)了數(shù)據(jù)UI。在 xml 布局文件中,通過(guò) Data Binding 綁定對(duì)應(yīng)的 ViewModel。 BaseViewModel 源碼如下:
View
框架封裝了 ArmsActivity 和 ArmsFragment,它們都實(shí)現(xiàn)了 Components 中的 LifecycleRegistryOwner 接口來(lái)處理生命周期。上面提到在 xml 布局中綁定 ViewModel,而 ViewModel 的創(chuàng)建和生命周期綁定是在 Activity/Fragment 中進(jìn)行的,具體是通過(guò) Components 中提供的 ViewModelProviders 類(lèi)完成的。下面是創(chuàng)建 ViewModel 的實(shí)例:
//創(chuàng)建ViewModel
mViewModel = ViewModelProviders.of(this, mViewModelFactory).get(WeatherViewModel.class);
- mViewModel 是通過(guò)泛型封裝在 ArmsActivity 和 ArmsFragment 中的;
- 同樣,mViewModelFactory 是通過(guò) Dagger 將 ViewModelFactory 注入在 ArmsActivity 和 ArmsFragment 中的。
- ViewModelProviders.of() 是一個(gè)重載的方法,通過(guò)傳入的第一個(gè)參數(shù),限定該 ViewModel 與 哪個(gè) Activity/Fragment 進(jìn)行生命周期綁定。
創(chuàng)建好了 ViewModel 后,在 ArmsActivity 和 ArmsFragment 設(shè)置 ViewModel 監(jiān)聽(tīng) Lifecyle 的回調(diào):
if (mViewModel != null)
getLifecycle().addObserver((LifecycleObserver) mViewModel);
同時(shí),需要將上述提到的 xml 中綁定的 ViewModel 進(jìn)行設(shè)置,這就很簡(jiǎn)單了,示例代碼如下:
mBinding.setViewModel(mViewModel);
源碼鏈接:
Github
更多細(xì)節(jié)請(qǐng)移步 Github,寫(xiě)了一個(gè)簡(jiǎn)單的 demo,歡迎 star、fork,issue、pr,希望可以一起交流:
參考
聯(lián)系
我是 xiaobailong24,您可以通過(guò)以下平臺(tái)找到我:
- Github: https://github.com/xiaobailong24
- 簡(jiǎn)書(shū): http://m.itdecent.cn/u/3dac2ad17b48
- 掘金: https://juejin.im/user/59413cdd61ff4b006cbd8a8a