一、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推荐组建,易用性和后期可维护性更强。