前言
按自己的理解,畫了簡圖
圖上可以看出:
1,MVP, MVVM 相對于 MVC , 其業務處理的部分(C, P, VM)不再依賴 V層 , 方便進行單元測試。
2,MVVM 與 MVP 的區別則在于不再通過 IView 接口更新 V 層。另外,個人覺得 MVVM 是數據驅動。
而 MVP是數據被動。這是由于MVVM 采用雙向binding模式,數據的改變會主動更新到V層。
MVVM
配置之類略過。這里講講這兩三天的整理。
項目基于1.1.1版本的 lifecycle 框架
api'android.arch.lifecycle:extensions:1.1.1'
kapt'com.android.databinding:compiler:3.1.2'
kapt'android.arch.lifecycle:compiler:1.1.1'
1,在做雙向綁定之前,準備好 VM
注:繼承 ViewModel,并將需要用于V層綁定數據定義成 MutableLiveData 對象。
2,準備好 V
注:
????1,根標簽需修改為 <layout>,lifecycle?library 會根據 xml 的名字自動生成布局binding類,比如布局名字為 test.xml, 生成的binding類則是 TestBinding 類。
????2,通過 data 標簽引入 VM。接著就可以在控件關聯 VM 里的?MutableLiveData 對象。圖中是 VM 類里定義的 tips 屬性。
3, MVVM 架構的關鍵,V, VM 之間的雙向綁定。
注:
1,TestBinding 類的 testVm 屬性是根據 test.xml 的 data 標簽里自定義的 variable name 自動生成的。
2,綁定 VM 時,需傳入 VM 的類型。如圖 TestVM::class.java。
至此,MVVM 的例子就完成了。
完了 ??
實際項目,Activity 多如牛毛。每個都這步驟,這流程,太不科學了。
按照上述流程整理一下
1,VM -?BaseViewModel
注:
? ? 1,沒什么特別的。主要是引入BaseViewEvent 的概念。由于 MVVM 是可以綁定控件事件的。但是又不想過度的污染 VM 類,所以單獨抽出 BaseViewEvent 來放置各種事件。
? ? 2,采用反射自動創建 BaseViewEvent 對象。
2,VM - BaseViewEvent
注:主要定義了兩個屬性 context 與 上層的 BaseViewModel。 這里互相引用。有點惡心。暫時沒想到好辦法。屬性的主要作用參考注釋。
3,V
????V沒什么整理,還是原來的V
4,BaseVMActivity - V, VM 之間的雙向綁定。
注:
? ? 1,由于?自動生成布局binding類是基于?ViewDataBinding 派生的。所以以泛型的形式?T : ViewDataBinding 傳入。
? ? 2,Binding類有了,想在基類?BaseVMActivity 統一綁定 VM。 所以再以泛型的形式?K : BaseViewModel
傳入。
????3,initReflect 方法里,獲取泛型的類型后生成 VM 對象。
????4,initReflect 方法里,通過反射找到根據 xml自動生成的binding類,再將 VM 對象設置到 xml 自定義的?variable name 里完成雙向綁定。
調整之后,再看看