一:LiveData是什么东西
1.基于观察者设计模式
LiveData是一种持有可被观察数据的类(被观察者)。LiveData需要一个观察者对象,一般是Observer类的具体实现。当观察者的生命周期处于STARTED或RESUMED状态时,LiveData会通知观察者数据变化。
2.LiveData能够感知activities/fragments/services生命周期
LiveData能够感知当activities/fragments/ services生命周期处于活跃状态(STARTED和RESUMED)时,才会通知这些组件更新数据变化。
3.LiveData能够自动解除数据订阅
二:LiveData的优点缺点
优点:
1UI和实时数据保持一致
因为LiveData采用的是观察者模式,这样一来就可以在数据发生改变时获得通知,更新UI。
2不会发生内存泄露
观察者被绑定到组件的生命周期上,当被绑定的组件销毁(onDestroy)时,观察者会立刻自动清理自身的数据。
3不会再产生由于Activity处于stop状态而引起的崩溃
例如:当Activity处于后台状态时,是不会收到LiveData的任何事件的。
4不需要再解决生命周期带来的问题
LiveData可以感知被绑定的组件的生命周期,只有在活跃状态才会通知数据变化。
5实时数据刷新
当组件处于活跃状态或者从不活跃状态到活跃状态时总是能收到最新的数据
6数据共享
如果对应的LiveData是单例的话,就能在app的组件间分享数据。这部分详细的信息可以参考继承LiveData
缺点:
三:LiveData的使用步骤
⒈创建一个持有某种数据类型的LiveData (通常是在ViewModel中)
⒉创建一个定义了onChange()方法的观察者。这个方法是控制LiveData中数据发生变化时,采取什么措施 (比如更新界面)。通常是在UI Controller (Activity/Fragment) 中创建这个观察者。
⒊通过 observe()方法连接观察者和LiveData。observe()方法需要携带一个LifecycleOwner类。这样就可以让观察者订阅LiveData中的数据,实现实时更新。
四:LiveData与MutableLiveData区别
LiveData与MutableLiveData的其实在概念上是一模一样的.唯一几个的区别如下:
MutableLiveData的父类是LiveData
LiveData在实体类里可以通知指定某个字段的数据更新.
MutableLiveData则是完全是整个实体类或者数据类型变化后才通知.不会细节到某个字段
五:LiveData 的 observe()和observerForever()区别
observe():当数据更新后,LiveData 会通知它的所有活跃的观察者(例如 Activity 位于 Destroyed 状态时是不活跃的,因此不会收到通知)。
observerForever() :不会受到 Activity 等组件的生命周期的影响,只要数据更新就会收到通知。
六:
LiveData常见使用场景
1.单独使用LiveData
首先创建一个 MutableLiveData(LiveData是抽象类)对象 ,通过 observe 方法可以订阅修改数据的通知,通过 postValue()或者 setValue() 方法发送事件更新数据,已经订阅的 Observer 能够得到数据更改的通知,就会回调 onChanged() 方法。
liveData = new MutableLiveData<>();
liveData.observe(this, new Observer<String>() {
@Override
public void onChanged(@Nullable final String newText) {
// 更新数据
tv3.setText(newText);
}
});
liveData.setValue("小杨真的是一个逗比么");
2. LiveData配合ViewModel使用
private TextViewModel model ;
private void initLiveData() {
// 创建ViewModel对象
model = ViewModelProviders.of(this).get(TextViewModel.class);
// 创建一个定义了onChange()方法的观察者对象nameObserver
// 开始订阅
final Observer<String> nameObserver = new Observer<String>() {
@Override
public void onChanged(@Nullable final String newText) {
// 更新数据
tvText.setText(newText);
}
};
//创建LiveData对象
MutableLiveData<String> mCurrentTextLiveData= model.getCurrentText();
// 通过 observe()方法连接观察者和LiveData,注意:observe()方法需要携带一个LifecycleOwner类
mCurrentTextLiveData .observe(this, nameObserver);
}
LiveData是一个数据的包装。具体的包装对象可以是任何数据,包括集合。它是一个抽象类,首先先创建一个类实现LiveData。
public class TextViewModel extends ViewModel {
/**
* LiveData是抽象类,MutableLiveData是具体实现类
*/
private MutableLiveData<String> mCurrentText;
public MutableLiveData<String> getCurrentText() {
if (mCurrentText == null) {
mCurrentText = new MutableLiveData<>();
}
return mCurrentText;
}
}
https://mp.weixin.qq.com/s/kcd0T3zwnfXA9b6_L2lzjA
https://mp.weixin.qq.com/s/MGjK0mXUmmW1P-u6vbGjLA