数据双向绑定:DataBinding VS Livedata+ViewModel

一、DataBinding

DataBinding是选择一个可以修改的控件,比如EditText、CheckBox等,对比单向绑定,需要多一个=符号,并且变量模型使用ObservableField ,就能保证View层和ViewModel层的 状态同步 了。

 BaseObservable 单向绑定,在中间又要写注解,又要加注解,然后还得用 notifyPropertyChanged(); 和 notifyChange(); 进行刷新。这样整体下来是比较麻烦的,所以,可以用ObservableField 进行单向绑定。

ObservableField 可以理解为是对 BaseObservable 的一层封装,省去了注解!与上文差别不大!

一个xml中可以写多个变量,比如一个事件模型,一个数据模型。

<data>
    <variable
        name="user"
        type="com.test.myapplication.bean.User"/>
    <variable
        name="listener"
        type="com.test.myapplication.MvvmActivity.Listener"/>
</data>

DataBinding需要在xml中配置java代码,适用于MVP框架,代码侵入性强。 

二、Livedata+ViewModel

1、ViewModel

ViewModel 是androidx包中抽象类,ViewModel是一个准备和管理Activity和Fragment的数据的类。

一个ViewModel关联到一个ViewModelStoreOwner(Activity或Fragment),如果ViewModelStoreOwner由于配置改变而被销毁时(比如屏幕旋转),ViewModel并不会被销毁,新的ViewModelStoreOwner实例会重新连接到已经存在的ViewModel。

ViewMode存在的目的,就是为Activity/Fragment 获得以及保留 必要信息。 Activity / Fragment 应该可以观察到VIewModel的变化,ViewModel通常通过LiveData或者DataBinding 或者其它观察的结构者框架暴露信息。

ViewModel仅有的职责,就是为UI管理数据,它不应该访问到你任何的View层级 或者 持有Activity 、Fragment的引用。

2、LiveData

Livedata 是androidx中架构组件之一,是一个存放可被观察的数据持有类,并且它具有生命周期感知能力。这样开发者就不必手动管理生命周期,规避内存泄漏问题。

Livedata 源码是通过Fragment感知Activity/Fragment生命周期的,通过observe方法可以为Activity/Fragment观察数据的改变从而更新UI。通常ViewModel中声明LiveData类型变量,实现数据的双向绑定。

public class MainViewModel extends ViewModel {
    private MutableLiveData<String> name= new MutableLiveData<String>();
    public MutableLiveData<String> getName() {
        return name;
    }
}
mViewModel = new ViewModelProvider(getActivity()).get(MainViewModel.class);

mViewModel.getName().observe(this,(String s)->{

mTxt.setText(s);

});

Livedata+ViewModel是google推荐组建,易用性和后期可维护性更强。

MVPDemo

MVVMDemo

猜你喜欢

转载自blog.csdn.net/u013795543/article/details/111767867