简介
LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData具有生命周期感知能力,意指它遵循其他应用组件(如Activity/Fragment)的生命周期。这种感知能力可确保 LiveData仅更新处于活跃生命周期状态的应用组件观察者。
优势
- UI和实时数据保持一致
LiveData 遵循观察者模式。当数据更新后,LiveData就会通知它的所有观察者;与RxJava的方法不同的是,LiveData并不是通知所有观察者,它只会通知处于活跃状态(Activity/Fragment 处于STARTED和RESUMED 状态)的观察者。
- 不会发生内存泄漏
观察者被绑定到组件的生命周期上,当被绑定的组件销毁(destory)时,观察者会立刻自动清理自身的数据。
- 不需要手动解除观察
开发者不需要在onPause或onDestroy方法中解除对LiveData的观察,因为LiveData能感知生命周期状态变化,所以会自动管理所有这些操作。
- 解决Configuration Change问题
在屏幕发生旋转或者被回收再次启动,立刻就能收到最新的数据。
用法
LiveData 和ViewModel 搭配使用
- 创建LiveData实例,指定源数据类型
LiveData是一个数据的包装。具体的包装对象可以是任何数据,包括集合。LiveData是一个抽象类,它的最简单的实现类为MutableLiveData。
public class ExViewModel extends ViewModel {
private MutableLiveData<Integer> num;
public MutableLiveData<Integer> getNum() {
if (num == null) {
num = new MutableLiveData<>();
}
return num;
}
}
- 观察LiveData中的数据
创建Observer实例,实现onChanged()方法,用于接收源数据变化并刷新UI。
num.observe(this, new Observer<Integer>() {
@Override
public void onChanged(Integer integer) {
tv_num.setText(String.valueOf(integer));
}
});
通过LiveData.observe()方法对LivaData所包装的数据进行观察。在onChanged方法就会收到我们修改之后的数据,我们就可以对UI进行更改了。
- 使用LiveData 更新数据
// 获取ViewModel 对象
ExViewModel model = new ViewModelProvider(this).get(ExViewModel.class);
// 获取LiveData 对象
MutableLiveData<Integer> num = model.getNum();
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
i++;
num.setValue(i);
}
});
通过LiveData.postValue/LiveData.setValue()方法修改数据。注意:setValue()方法必须在主线程使用,如果是在工作线程中更新LiveData,则可以使用postValue()方法。
效果:
转换LiveData 数据
如果想要在LiveData对象分发给观察者之前对其中存储的值进行更改,可以使用Transformations.map()和Transformations.switchMap()。
- Transformations.map
MutableLiveData<Integer> num=new MutableLiveData<>();
LiveData<String> info=Transformations.map(num, new Function<Integer, String>() {
@Override
public String apply(Integer input) {
return input+"次点击";
}
});
info.observe(this, new Observer<String>() {
@Override
public void onChanged(String s) {
Log.e(TAG,"--->"+s);
}
});
num.setValue(1);
// 执行结果:
ExJetPackActivity: --->1次点击
通过Transformations.map()方法对源数据Integer 类型LiveData,修改成String 类型LiveData。
- Transformations.switchMap
如果想要根据某个值 切换观察不同LiveData数据,则可以使用Transformations.switchMap()方法。
MutableLiveData<String> work=new MutableLiveData<>();
work.setValue("加班");
MutableLiveData<String> rest=new MutableLiveData<>();
rest.setValue("双休");
MutableLiveData<Boolean> conditions=new MutableLiveData<>();
conditions.setValue(true);
LiveData<String> result=Transformations.switchMap(conditions, new Function<Boolean, LiveData<String>>(