首先感謝 JessYan 開源的 MVPArms玻募,學(xué)到了很多知識,也方便了公司項目的開發(fā)葫录!
在 Google I/O 2017 大會上剧董,Google 推出了新的組件庫 - Android Architecture Components,官方文檔做的很詳細(xì)尘喝,分別介紹了各個組件的應(yīng)用場景和使用方式磁浇,這無疑會推進(jìn) Android MVVM 模式的發(fā)展。關(guān)于 MVVM 這里不做過多介紹朽褪,如果有需要可以自行搜索置吓。
正文
Android Architecture Components 簡介
先來看一下 Android Architecture Components 包含哪些內(nèi)容:
加上之前推出的 Data Binding Library
如果想要引用 Components,可參考以下鏈接:
注意:如果你無法訪問 Google Maven 庫缔赠,可以使用以下地址代替:
maven { url "https://dl.google.com/dl/android/maven2" }
這里需要特別說明的是衍锚,ViewModel 相當(dāng)于 MVVM 的 VM 層,它和 View 是通過 Data Binding 雙向綁定的嗤堰,ViewModel 不再持有 View 的引用戴质,而是存儲UI相關(guān)的數(shù)據(jù);而且 ViewModel 是生命周期感知的踢匣,當(dāng)創(chuàng)建它的 Activity/Fragment 銷毀時告匠,ViewModel 會自動銷毀。
MVVMArms 框架圖
這里引用 官方 架構(gòu)圖离唬,參考 MVPArms 做了一些修改后专。
整個框架采用 Dagger 進(jìn)行依賴注入,并使用了最新的 Dagger.Android输莺,組織好 Module 和 Components戚哎,框架會自動注入。具體可參考 demo嫂用。
MVVM 組件的封裝
Model
框架中型凳,數(shù)據(jù)的獲取是通過 Model 層獲取的,在 Model 中持有一個數(shù)據(jù)管理類對象- RepositoryManager(實現(xiàn)了 IRepositoryManager 接口)嘱函,分別可以通過 Retrofit
獲取網(wǎng)絡(luò)數(shù)據(jù)甘畅,通過 Room 獲取 SQLite 數(shù)據(jù)庫中的持久化數(shù)據(jù)。具體實現(xiàn)可查看源碼鏈接:
Room 的使用需要在 gradle 中添加:
android {
...
//Room
javaCompileOptions {
annotationProcessorOptions {
arguments = ["room.schemaLocation":
"$projectDir/schemas".toString()]
}
}
}
ViewModel
ViewModel 是整個框架比較新穎和重要的部分往弓,BaseViewModel 繼承于 Components 中的 AndroidViewModel疏唾,并實現(xiàn)了 LifecycleObserver 接口;它持有 Model 的引用亮航,主要的業(yè)務(wù)邏輯都是在 ViewModel 中實現(xiàn)的荸实;ViewModel 中UI相關(guān)的數(shù)據(jù)通過 LiveData 包裝,使得當(dāng)數(shù)據(jù)變化時缴淋,自動反映到UI上准给,實現(xiàn)了數(shù)據(jù)UI泄朴。在 xml 布局文件中,通過 Data Binding 綁定對應(yīng)的 ViewModel露氮。 BaseViewModel 源碼如下:
View
框架封裝了 ArmsActivity 和 ArmsFragment祖灰,它們都實現(xiàn)了 Components 中的 LifecycleRegistryOwner 接口來處理生命周期。上面提到在 xml 布局中綁定 ViewModel畔规,而 ViewModel 的創(chuàng)建和生命周期綁定是在 Activity/Fragment 中進(jìn)行的局扶,具體是通過 Components 中提供的 ViewModelProviders 類完成的。下面是創(chuàng)建 ViewModel 的實例:
//創(chuàng)建ViewModel
mViewModel = ViewModelProviders.of(this, mViewModelFactory).get(WeatherViewModel.class);
- mViewModel 是通過泛型封裝在 ArmsActivity 和 ArmsFragment 中的叁扫;
- 同樣三妈,mViewModelFactory 是通過 Dagger 將 ViewModelFactory 注入在 ArmsActivity 和 ArmsFragment 中的。
- ViewModelProviders.of() 是一個重載的方法莫绣,通過傳入的第一個參數(shù)畴蒲,限定該 ViewModel 與 哪個 Activity/Fragment 進(jìn)行生命周期綁定。
創(chuàng)建好了 ViewModel 后对室,在 ArmsActivity 和 ArmsFragment 設(shè)置 ViewModel 監(jiān)聽 Lifecyle 的回調(diào):
if (mViewModel != null)
getLifecycle().addObserver((LifecycleObserver) mViewModel);
同時模燥,需要將上述提到的 xml 中綁定的 ViewModel 進(jìn)行設(shè)置,這就很簡單了掩宜,示例代碼如下:
mBinding.setViewModel(mViewModel);
源碼鏈接:
Github
更多細(xì)節(jié)請移步 Github蔫骂,寫了一個簡單的 demo,歡迎 star牺汤、fork辽旋,issue、pr慧瘤,希望可以一起交流:
參考
聯(lián)系
我是 xiaobailong24戴已,您可以通過以下平臺找到我: