MVVMArms - MVVM 與 Android Architecture Components 的最佳實(shí)戰(zhàn)

首先感謝 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 做了一些修改。

MVVMArms _Architecture
MVVMArms _Architecture

整個(gè)框架采用 Dagger 進(jìn)行依賴(lài)注入,并使用了最新的 Dagger.Android,組織好 ModuleComponents,框架會(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

框架封裝了 ArmsActivityArmsFragment,它們都實(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ò)泛型封裝在 ArmsActivityArmsFragment 中的;
  • 同樣,mViewModelFactory 是通過(guò) Dagger 將 ViewModelFactory 注入在 ArmsActivityArmsFragment 中的。
  • ViewModelProviders.of() 是一個(gè)重載的方法,通過(guò)傳入的第一個(gè)參數(shù),限定該 ViewModel 與 哪個(gè) Activity/Fragment 進(jìn)行生命周期綁定。

創(chuàng)建好了 ViewModel 后,在 ArmsActivityArmsFragment 設(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)找到我:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,326評(píng)論 25 708
  • afinalAfinal是一個(gè)android的ioc,orm框架 https://github.com/yangf...
    passiontim閱讀 15,898評(píng)論 2 45
  • 在對(duì)MVP的架構(gòu)實(shí)踐中,發(fā)現(xiàn)寫(xiě)單元測(cè)試不是那么方便,因?yàn)镻resenter持有了View的引用,而Mock Vi...
    Mr云臺(tái)閱讀 2,101評(píng)論 1 5
  • 高頻的學(xué)習(xí)生活,一批批作業(yè)讓自己如陀螺一般轉(zhuǎn)著,整個(gè)人處于心累卻不困的狀態(tài),此時(shí)外界的聲音仿佛都可以被自己屏蔽,只...
    十二yql閱讀 290評(píng)論 0 1
  • 作者:溫馨萬(wàn)家 很晚了,喧鬧了一天的田地里異常靜謐,偶爾傳來(lái)蟋蟀的悉悉索索的聲音,和著莊稼熟透的香味,給人一種溫馨...
    魏喜梅wxm閱讀 555評(píng)論 0 3

友情鏈接更多精彩內(nèi)容