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

xiaobailong24發表於2017-09-18

首先感謝 JessYan 開源的 MVPArms,學到了很多知識,也方便了公司專案的開發!
在 Google I/O 2017 大會上,Google 推出了新的元件庫 - Android Architecture Components,官方文件做的很詳細,分別介紹了各個元件的應用場景和使用方式,這無疑會推進 Android MVVM 模式的發展。關於 MVVM 這裡不做過多介紹,如果有需要可以自行搜尋。

正文

Android Architecture Components 簡介

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

加上之前推出的 Data Binding Library

如果想要引用 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,您可以通過以下平臺找到我:

相關文章