一般情况下LiveData都是搭配这ViewModel使用,这里先介绍一下LiveData,再结合ViewModel使用
- Android数据绑定技术一,企业级开发
- Android数据绑定技术二,企业级开发
- Android JetPack~ DataBinding(数据绑定)(一) 集成与使用
- Android JetPack~ LiveData (一) 介绍与使用
- Android JetPack~ ViewModel (一) 介绍与使用
目录
1、什么是LiveData
- LiveData是一个观察者模式的数据实体类,它可以在所有注册观察者回调里查看数据是否有更新。
- LiveData它能感知绑定者的生命周期(如Activity,Fragment),不会发生内存泄露,因为它只会给活跃状态的activity回调,我们在使用的时候通常都会在回调里去更新UI。
- 从非活跃状态变为活跃状态时,回调方法会立即接收到最新的数据
- 当设备切横竖屏,会重建Activity生命周期,它也会立即接收最新的可用数据。
- 不可变,setValue和postValue不支持外部使用(protected修饰)。下面代码讲解
- 抽象类,无法直接new
2、什么是MutableLiveData
- MutableLiveData的父类是LiveData
- 用法和LiveData类似,也是在注册观察者回调里查看更新数据
- 可变,setValue和postValue支持外部使用(public修饰)
- 普通类,可以直接new
3、LiveData与MutableLiveData区别
- LiveData在实体类里可以通知指定某个字段的数据更新.(下面会贴代码)
- MutableLiveData则是完全是整个实体类或者数据类型变化后才通知.不会细节到某个字段
4、LiveData的使用
public class UserBean extends LiveData<UserBean> { String name; int age; public String getName() { return name; } public void setName(String name) { this.name = name; postValue(this); } public int getAge() { return age; } public void setAge(int age) { this.age = age; postValue(this); } }
postValue(this);这个方法是用于触发回调数据更新的方法. 你可以在你需要被观察的数据里添加.
小注意点:如果不使用postValue(this)会怎么样?
public void setAge(int age) { this.age = age; // postValue(this); // 如果不写的话,单独调用setAge后,在外getAge获取不到值,因为回调没有被触发, // 如果name写了postValue(this),更新了name也会连着age更新,因为传的是this }
你也可以集成LiveData<String>,那么postValue(string),回调中只会接收postValue最后的赋值。
4.1ViewModel新建
public class MyViewModel extends ViewModel { public UserBean mUserBean = new UserBean(); public UserBean getUserBean() { return mUserBean; } }
4.2Activity中添加回调方法
//通过ViewModeProvider 把activity和ViewModel绑定起来。 myViewModel = new ViewModelProvider(this, new ViewModelProvider.NewInstanceFactory()).get(MyViewModel.class); observer = new Observer<UserBean>() { @Override public void onChanged(UserBean userBean) { Log.e("activity",userBean.getName()); mBinding.textShow.setText("name="+userBean.getName()+" ,, age="+userBean.getAge()+""); } }; //绑定观察者 myViewModel.getUserBean().observe(this, observer); a = 0; mBinding.btnUpdata.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { myViewModel.getUserBean().setName("大王"+a); myViewModel.getUserBean().setAge(a++); } });
注意:这里的myViewModel.getUserBean().observe() 是LiveData的方法。
我们上面创建了一个Observer,并且和activity关联,然后通过一个按钮去动态设置值,果然回调里就会有数据更新。
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) {
4.3有绑定就会有解绑
myViewModel.getUserBean().removeObserver(observer);
5、MutableLiveData的使用
它是直接作用在变量上,mStr.setValue(s);触发观察者的回调。
public class MyViewModel extends ViewModel { private MutableLiveData<String> mStr; public MutableLiveData<String> getmStr() { return mStr; } public void setmStr(String s) { if(mStr==null){ mStr = new MutableLiveData<>(); } mStr.setValue(s); } }
5.1在activity中使用
myViewModel.getmStr().observe(this, new Observer<String>() { @Override public void onChanged(String s) { } });
6、LiveData和MutableLiveData的可变与不可变
其实就是setValue和postValue是否暴露问题,LiveData中是不支持外部使用,而MutableLiveData特意放开
@SuppressWarnings("WeakerAccess") public class MutableLiveData<T> extends LiveData<T> { @Override public void postValue(T value) { super.postValue(value); } @Override public void setValue(T value) { super.setValue(value); } }
可以看到在MutableLiveData包裹的有setValue,postValue方法