平常寫一些小專案的時候可能就是一味地把資料處理、邏輯等一切的一切都塞在Activity或Fragment。現在我們要把這些東西抽離UI層,分開來一層一層寫。從以前的Mvc、Mvp到現在的Mvvm都是在做類似的事。MVVM是Model、View、ViewModel的簡稱。Model就是資料來源,ViewModel就是跟Model拿資料做邏輯運算,最後再由View層來跟ViewModel取得資料顯示在畫面上。
負責管理資料來源。這裡的Model,不單指Data model,包含取得、更新等操作,例如Web API、SharedPreference等資料來源。
指的是Activity、Fragment、res/layout裡xml,這些都屬於View。View只處理顯示UI及與使用者互動。
ViewModel 是 Android 提供的一套 library ,主要用途是讓我們暫存跟管理讓 UI 層使用的資料,ViewModel 不會知道 UI 層的存在,通常是透過 LiveData 或其他類似機制給 UI 層,讓 UI 層註冊得到資料更新的事件。
在 MVVM 的架構裡,外層只會依賴內層這種守則是必須被嚴格遵守的。
ViewModel 的另一個優點是因為 Activity 層常會有螢幕旋轉等事件會重建 Activity,資料必須不斷的儲存再拿出來其實有點麻煩,而透過 ViewModel 可以讓我們安全方便的保存較龐大的資料。
我們再進一步做細分,我們在架構中加入Repository。Repository是我們拿到資料後進行解析或處理的地方,常見的用法是Repository掌管所有的資料出入口,ViewModel一律透過Repository來存取資料。
Activity/Fragment 所在的 UI 層只會知道 ViewModel 的存在,而 ViewModel 則依據不同需求依賴不同的 Repository 獲取資料或是進行其他互動,Repository 則可以依據自己的商業邏輯決定從 Retrofit 跟後端要資料或是直接透過 Room 拿本地端的資料回傳給 ViewModel,而 UI 層會直接跟 ViewModel 註冊資料更新的通知。
以往我們要依據資料變動更改畫面中顯示的值時,只能在activity設置監聽器,然後手動更改元件的顯示值。而dataBinding就是直接在layout用聲明式的方式綁定ViewModel中各項資料的值,只要資料有變動,畫面上顯示的資料也會更新。
明天債來做範例:D