天天看點

Android MVVM-程式設計思想1(入門介紹MVVM,DataBinding,ViewModel,LiveData)

前言

通過一個小案例,幫助大家了解MVVM。最終實作一個MVVM通用架構。代碼:github。(如有錯誤之處,請在評論區指出,謝謝。如果感覺寫的不錯,請點贊,關注,謝謝。)

上一個小節,隻是理論介紹了MVVM,DataBinding,ViewModel,LiveData,這一小節,講解一下他們的使用方式。如果已經對這些基礎知識很了解,可以直接看下一節。

目錄:

Android MVVM-程式設計思想1(入門介紹MVVM,DataBinding,ViewModel,LiveData)

Android MVVM-程式設計思想2(入門實戰MVVM,DataBinding,ViewModel,LiveData)

Android MVVM-程式設計思想3(封裝基類BaseMvvmActivity,BaseMvvmFragment)

什麼是MVVM?

盜的一張圖

Android MVVM-程式設計思想1(入門介紹MVVM,DataBinding,ViewModel,LiveData)

View:對應于Activity/Fragment/自定義View,主要負責UI渲染。

Model:實體模型

ViewModel: 負責業務邏輯處理,負責View和Model的互動。和View層雙向綁定。

Android MVVM-程式設計思想1(入門介紹MVVM,DataBinding,ViewModel,LiveData)

Mvvm模式是通過将View層和ViewModel層進行雙向綁定, View層的變化會自動通知給ViewModel層,而ViewModel層的資料變化也會通知給View層進行相應的UI的更新。這樣,Model層隻負責暴露擷取資料的方法,View層隻負責監聽資料的變化更新,而ViewModel負責接收View層的事件指令以及擷取并處理資料。進而實作業務邏輯和Ui的隔離。

對比MVP

了解MVP程式設計思想的同學都知道MVP一個最大的缺點就是需要寫大量接口。沒接觸過MVP的童鞋可以看一下我之前寫的 Android-MVP程式設計思想系列。

MVP是對MVC的C的演化,MVVM是對MVP的P的演化。MVVM的出現是MVP的進化版本,彌補了MVP需要大量接口的缺點。如何彌補的?使用了雙向綁定這個思想。原來MVP,M和V直接的通信通過P層和接口來實作。現在使用雙向綁定,VM,是以就不需要接口了。MVVM是一種思想,采用雙向綁定将Model和View綁定起來, View的變動自動反映在View Model,反之亦然。這樣開發者就不用處理接收事件和View更新的工作,架構已經幫你做好了,雙向綁定的機制使得M和V之間的通信工作不需要再使用接口了。

涉及的庫

(1) DataBinding

Data Binding顧名思義,資料綁定,是Google對MVVM在Android上的一種實作,可以直接綁定資料到xml中,并實作自動重新整理。現在最新的版本還支援雙向綁定。

作用:資料與view自動映射,是以不需要寫findViewByid, onClickListernr.(這一點類似使用的ButterKnife)

不需要setText()手動設定資料。比手動性能更高。

(1) ViewModel

MVVM中的VM,非常重要,負責加載資料,邏輯編寫。

Android 官方提供了ViewModel基類是以可感覺生命周期的方式存儲和管理 UI 相關資料。我隻想說,太他踏馬好用了。。。。

優勢(1)舉個栗子:在螢幕旋轉的時候會經曆 Activity 的銷毀與重新建立,這裡就涉及到資料儲存的問題,顯然重新請求或加載資料是不友好的。在 ViewModel 出現之前我們可以用 Activity 的 onSaveInstanceState() 機制儲存和恢複資料,但缺點很明顯,onSaveInstanceState隻适合儲存少量的可以被序列化、反序列化的資料,這種機制明顯不合适。是以上ViewModel…屌炸天,有沒有,讓開發者隻專注業務邏輯。

優勢(2)Fragments 間共享資料,看代碼(來自andorid官網)

public class SharedViewModel extends ViewModel {
        private final MutableLiveData<Item> selected = new MutableLiveData<Item>();

        public void select(Item item) {
            selected.setValue(item);
        }

        public LiveData<Item> getSelected() {
            return selected;
        }
    }

    public class MasterFragment extends Fragment {
        private SharedViewModel model;
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
            itemSelector.setOnClickListener(item -> {
                model.select(item);
            });
        }
    }

    public class DetailFragment extends Fragment {
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            SharedViewModel model = ViewModelProviders.of(getActivity()).get(SharedViewModel.class);
            model.getSelected().observe(this, { item ->
               // Update the UI.
            });
        }
    }
    
           
LiveData

是一種可觀察的資料存儲器類。與正常的可觀察類不同,LiveData 具有生命周期感覺能力,意指它遵循其他應用元件(如 Activity、Fragment 或 Service)的生命周期。這種感覺能力可確定 LiveData 僅更新處于活躍生命周期狀态的應用元件觀察者。

解釋一下:這是因為LiveData能夠感覺到元件的生命周期,當元件處于DESTROYED狀态時,觀察者對象會被清除掉。當Activity停止時不會引起崩潰,這是因為元件處于非激活狀态時,不會收到,不需要額外的手動處理來響應生命周期的變化。屌炸天的東西,用起來。。。。

總結一句:mvvm對mvp的橫向演進,用雙向綁定機制解放了我們拿到資料關注某個具體控件,并隐式的綁定了View層的生命周期,在記憶體洩漏上有一定優勢。

這一小節簡單介紹了MVVM模式,以及Android中支援MVVM的官方庫。下一節開始使用這些庫來封裝好用的MVVM架構。

參考:

https://blog.csdn.net/user11223344abc/article/details/82661128

https://blog.csdn.net/yyz_1987/article/details/81380664