MVVMArms - MVVM 與 Android Architecture Components 的最佳實戰

首先感謝 JessYan 開源的 MVPArms,學到了不少知識,也方便了公司項目的開發!
在 Google I/O 2017 大會上,Google 推出了新的組件庫 - Android Architecture Components,官方文檔作的很詳細,分別介紹了各個組件的應用場景和使用方式,這無疑會推動 Android MVVM 模式的發展。關於 MVVM 這裏不作過多介紹,若是有須要能夠自行搜索。html

正文

Android Architecture Components 簡介

先來看一下 Android Architecture Components 包含哪些內容:java

加上以前推出的 Data Binding Librarybash

若是想要引用 Components,可參考如下連接:網絡

注意:若是你沒法訪問 Google Maven 庫,可使用如下地址代替:
maven { url "dl.google.com/dl/android/…" }架構

這裏須要特別說明的是,ViewModel 至關於 MVVM 的 VM 層,它和 View 是經過 Data Binding 雙向綁定的,ViewModel 再也不持有 View 的引用,而是存儲UI相關的數據;並且 ViewModel 是生命週期感知的,當建立它的 Activity/Fragment 銷燬時,ViewModel 會自動銷燬。框架

MVVMArms 框架圖

這裏引用 官方 架構圖,參考 MVPArms 作了一些修改。

MVVMArms _Architecture
MVVMArms _Architecture

整個框架採用 Dagger 進行依賴注入,並使用了最新的 Dagger.Android,組織好 ModuleComponents,框架會自動注入。具體可參考 demo。

MVVM 組件的封裝

Model

框架中,數據的獲取是經過 Model 層獲取的,在 Model 中持有一個數據管理類對象- RepositoryManager(實現了 IRepositoryManager 接口),分別能夠經過 Retrofit
獲取網絡數據,經過 Room 獲取 SQLite 數據庫中的持久化數據。具體實現可查看源碼連接:

Room 的使用須要在 gradle 中添加:

android {
...

    //Room
    javaCompileOptions {
        annotationProcessorOptions {
            arguments = ["room.schemaLocation":
                                 "$projectDir/schemas".toString()]
        }
    }
}複製代碼

ViewModel

ViewModel 是整個框架比較新穎和重要的部分,BaseViewModel 繼承於 Components 中的 AndroidViewModel,並實現了 LifecycleObserver 接口;它持有 Model 的引用,主要的業務邏輯都是在 ViewModel 中實現的;ViewModel 中UI相關的數據經過 LiveData 包裝,使得當數據變化時,自動反映到UI上,實現了數據UI。在 xml 佈局文件中,經過 Data Binding 綁定對應的 ViewModel。 BaseViewModel 源碼以下:

View

框架封裝了 ArmsActivityArmsFragment,它們都實現了 Components 中的 LifecycleRegistryOwner 接口來處理生命週期。上面提到在 xml 佈局中綁定 ViewModel,而 ViewModel 的建立和生命週期綁定是在 Activity/Fragment 中進行的,具體是經過 Components 中提供的 ViewModelProviders 類完成的。下面是建立 ViewModel 的實例:

//建立ViewModel
mViewModel = ViewModelProviders.of(this, mViewModelFactory).get(WeatherViewModel.class);複製代碼
  • mViewModel 是經過泛型封裝在 ArmsActivityArmsFragment 中的;
  • 一樣,mViewModelFactory 是經過 Dagger 將 ViewModelFactory 注入在 ArmsActivityArmsFragment 中的。
  • ViewModelProviders.of() 是一個重載的方法,經過傳入的第一個參數,限定該 ViewModel 與 哪一個 Activity/Fragment 進行生命週期綁定。

建立好了 ViewModel 後,在 ArmsActivityArmsFragment 設置 ViewModel 監聽 Lifecyle 的回調:

if (mViewModel != null)
    getLifecycle().addObserver((LifecycleObserver) mViewModel);複製代碼

同時,須要將上述提到的 xml 中綁定的 ViewModel 進行設置,這就很簡單了,示例代碼以下:

mBinding.setViewModel(mViewModel);複製代碼

源碼連接:

Github

更多細節請移步 Github,寫了一個簡單的 demo,歡迎 star、fork,issue、pr,但願能夠一塊兒交流:

參考

聯繫

我是 xiaobailong24,您能夠經過如下平臺找到我:

相關文章
相關標籤/搜索