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

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

MVVMArms _Architecture
MVVMArms _Architecture

整個框架采用 Dagger 進(jìn)行依賴注入,并使用了最新的 Dagger.Android输莺,組織好 ModuleComponents戚哎,框架會自動注入。具體可參考 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

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

創(chuàng)建好了 ViewModel 后对室,在 ArmsActivityArmsFragment 設(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戴已,您可以通過以下平臺找到我:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末固该,一起剝皮案震驚了整個濱河市锅减,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌伐坏,老刑警劉巖怔匣,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異桦沉,居然都是意外死亡每瞒,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進(jìn)店門纯露,熙熙樓的掌柜王于貴愁眉苦臉地迎上來剿骨,“玉大人,你說我怎么就攤上這事埠褪∨ɡ” “怎么了挤庇?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長贷掖。 經(jīng)常有香客問我嫡秕,道長,這世上最難降的妖魔是什么苹威? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任昆咽,我火速辦了婚禮,結(jié)果婚禮上牙甫,老公的妹妹穿的比我還像新娘凝化。我一直安慰自己,他們只是感情好偏陪,可當(dāng)我...
    茶點故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布铡恕。 她就那樣靜靜地躺著,像睡著了一般脏答。 火紅的嫁衣襯著肌膚如雪糕殉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天殖告,我揣著相機與錄音阿蝶,去河邊找鬼。 笑死黄绩,一個胖子當(dāng)著我的面吹牛羡洁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播爽丹,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼筑煮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了粤蝎?” 一聲冷哼從身側(cè)響起真仲,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎初澎,沒想到半個月后秸应,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡碑宴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年软啼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片延柠。...
    茶點故事閱讀 39,754評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡祸挪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出贞间,到底是詐尸還是另有隱情贿条,我是刑警寧澤盈罐,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站闪唆,受9級特大地震影響盅粪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜悄蕾,卻給世界環(huán)境...
    茶點故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一票顾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧帆调,春花似錦奠骄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至芹务,卻和暖如春蝉绷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背枣抱。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工熔吗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人佳晶。 一個月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓桅狠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親轿秧。 傳聞我的和親對象是個殘疾皇子中跌,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,654評論 2 354

推薦閱讀更多精彩內(nèi)容

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