是一种可观察的数据存储器类。该类遵循其他组件的生命周期,这样的一种特性保证它只观察处于活跃生命状态的组件观察者
如果观察者(由 Observer
类表示)的生命周期处于 STARTED
或 RESUMED
状态,则 LiveData 会认为该观察者处于活跃状态。LiveData 只会将更新通知给活跃的观察者。为观察 LiveData
对象而注册的非活跃观察者不会收到更改通知。
LifeCycles
绑定,在组件生命周期结束后,自动清理在ViewModel
类中创建LiveData
实例,用以存储某类型的数据,并可通过 getter 方法进行访问
private MutableLiveData<Integer> score;
public MutableLiveData<Integer> getScore() {
if(score==null){
score=new MutableLiveData<>();
score.setValue(0);
}
return scoreA;
}
在界面控制器(如 Activity 或 Fragment)中创建 Observer
对象
一般来讲,在onCreate
中开始观察LiveData,保证组件变活跃后有立即可以观察的对象
Observer<Integer> observer=new Observer<Integer>() {
@Override
public void onChanged(Integer s) {
//updateUI
}
};
使用 observe()
方法将 Observer
对象附加到 LiveData
对象。observe()
方法会采用 LifecycleOwner
对象。这样会使 Observer
对象订阅 LiveData
对象,以使其收到有关更改的通知
viewModel.getScoreA().observe(this,observer);
LiveData
是可以在给定生命周期内观察到的数据持有者类。
即 将LifecycleOwner
和Observer
成对添加,当配对的LifecycleOwner
处于活动状态,即Lifecycle.State.STARTED
或Lifecycle.State.RESUMED
时,向观察者发送有关包装数据的修改。
通过 observeForever
(Observer)添加的观察者被视为始终处于活动状态,始终能收到消息。需手动移除
生命周期移至 Lifecycle.State.DESTROYED
状态时,添加了生命周期的观察者被移除,保证不会内存泄漏。
主要方法:
onActive()
和onInactive()
:在观察者数量在0-1变化时通知,方便在没有观察者的情况下释放大量资源
getValue()
: 获取LiveData 包装的数据
observe(LifecycleOwner owner, Observer super T> observer)
设置观察者(主线程调用)
setValue(T value)
设值(主线程调用),可见性为 protected 无法直接使用
postValue(T value)
设置(其他线程调用),可见性为 protected 无法直接使用
继承自LiveData
,是LiveData的实现类
,公开了 setValue
和 postValue
方法。
接口类,内部只有一个方法onChanged(T t)
,数据发生变化时调用
调用 observe 方法时,部是通过 LifecycleBoundObserver
将 owner 和 observer 包裹起来并通过 addObserver
方法添加观察者的,因而当数据变化时,会调用 LifecycleBoundObserver
的 onStateChanged
方法
以下是onStateChanged
方法
@Override
public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {
if (mOwner.getLifecycle().getCurrentState() == DESTROYED) {
removeObserver(mObserver);
return;
}
activeStateChanged(shouldBeActive());
}
传入了一个shouldBeActive()
方法,只有 STARTED
和 RESUMED
状态 shouldBeActive()
才返回 true,因此只有在Activity和Fragment处于活动状态时才接受观察。
以下代码是在LifecycleBoundObserver
的 onStateChanged
中的
if (mOwner.getLifecycle().getCurrentState() == DESTROYED) {
removeObserver(mObserver);
return;
}
表明在DESTROYED
状态,会移除掉观察者
LiveData
持有最新的数据dispatchingValue
方法内部调用了 considerNotify
方法,在considerNotify
中区别了observer的版本号,如果是最新的数据则直接return
mVersion
在 setValue
方法中 进行更改,保证了数据最新
参考自:【背上Jetpack之LiveData】ViewModel 的左膀右臂 数据驱动真的香
https://juejin.im/post/6844904111112978439