LiveData 基本使用
一、说明
- 基于观察者模式的消息订阅/分发组件,具有宿主生命周期感知能力,因此可以确保LiveData仅分发消息给处于活跃状态的观察者;
- 作用:减少资源占用–页面不可见时不会派发消息;
- 确保页面始终保持最新状态–页面活跃时,会立刻派发最新的一条消息给所有观察者;
- 不再需要手动处理生命周期–避免NPE;
- 可以打造不用反注册,不会内存泄漏的消息总线–取代eventbus。
二、使用
-
添加依赖
在官网找合适版本的依赖。 -
自定义 LiveData,也可使用系统提供的 MutableLiveData<>
public class MyLiveData extends LiveData<String> {
//单例
private MyLiveData(){}
private static class Instance{
private static MyLiveData instance = new MyLiveData();
}
public static MyLiveData getInstance() {
return Instance.instance;
}
//数据
private String text = "Livedata";
public String getText() {
return text;
}
//数据修改时发布消息
public void setText(String text) {
this.text = text;
//消息发送,setValue(T value) 也可
postValue(text);
}
}
- 在任意地方对自定义的 LiveData 添加观察者
MyLiveData liveData = MyLiveData.getInstance();
liveData.observe(this, new Observer<String>() {
@Override
public void onChanged(String s) {
Log.i("TAG","数据已经改变。");
}
});
- 在任意地方对自定义的 LiveData 进行数据修改
MyLiveData liveData = MyLiveData.getInstance();
liveData.setText("新的数据");
- 所有注册了观察者的onChanged 会被回调。
三、补充
- 由于注册了观察者的只有一个对象,所以该类可以设计为单例,非单例需要注意注册的对象状态。
- 与 ViewModel 搭配使用,在 ViewModel 中长期保存单个对象,并且所有生命周期都可以对数据进行获取。当修改时也可以对活跃的观察者进行消息分发,这就不需要设计为单例。
- 使用 MutableLiveData 的话,使用 LiveData.post(T value) 发送消息即可。
四、注意
- 粘性事件:消息分发有版本控制,version 的字段记录了数据变化的次数,初始值 -1。若添加观察者时 version 已经 >0 ,则会自动进行版本同步,发送每次数据变化的内容进行回调。version 在 LiveData 和 Observer 皆有。
处理办法:注册时将自己的 lastVersion 设置与 LiveData 的 mVersion 相同的值即可。 - 观察者 onChange() 触发:
- 粘性事件,version 不同触发。
- 观察者生命周期变化触发。
- 数据变化,postValue() 或 setValue() 触发。