MutableLiveData笔记
- MutableLiveData是什么?
- LiveData是什么?
- LiveData常用的方法
- MutableLiveData和LiveData的区别
- 关于postValue和setValue的机制简单理解
MutableLiveData是什么?
public class MutableLiveData
extends LiveData<T>
java.lang.Object
↳ android.arch.lifecycle.LiveData<T>
↳ android.arch.lifecycle.MutableLiveData<T>
MutableLiveData是LiveData的子类
LiveData是什么?
Android的官方文档种描述为可以在给定生命周期中观察的数据持有类。
因此生命周期拥有者应和观察者成对添加,使用observe:当LiveData中的数据发生变化时,并且生命周期的状态为START或是RESUME状态时,观察者就能观察到数据变化。这么做的原因是避免资源的浪费,当所有者的状态变为destroy状态,观察者将自动被移除。
LiveData常用的方法
- postValue
作用是在子线程更新数据,当然在主线程中也可以使用。 - setValue
作用是在主线程中修改数据,注意只能在主线程中调用
注意两个方法都是protected修饰的,因此一般封装一个继承LiveData的类,在该类的中调用此方法。
- observe
void observe (LifecycleOwner owner,
Observer<T> observer)
作用是添加生命周期拥有者和观察者,当拥有者处于活跃状态时,观察者能接收到数据更新。
- observeforever
void observeForever (Observer<T> observer)
作用是观察数据变化,可以无视生命周期的变化,因此需要手动移除。
注意,此时已不需要添加生命周期拥有者。
为什么可以不添加生命周期拥有者呢?因为这个方法的作用就如他的名字一样,一直观察数据是否变化。
@MainThread
public void observeForever(@NonNull Observer<? super T> observer) {
assertMainThread("observeForever");
AlwaysActiveObserver wrapper = new AlwaysActiveObserver(observer);
ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);
if (existing != null && existing instanceof LiveData.LifecycleBoundObserver) {
throw new IllegalArgumentException("Cannot add the same observer"
+ " with different lifecycles");
}
if (existing != null) {
return;
}
wrapper.activeStateChanged(true);
}
最后一行就是其中的秘密
void activeStateChanged(boolean newActive) {
if (newActive == mActive) {
return;
}
// immediately set active state, so we'd never dispatch anything to inactive
// owner
mActive = newActive;
boolean wasInactive = LiveData.this.mActiveCount == 0;
LiveData.this.mActiveCount += mActive ? 1 : -1;
if (wasInactive && mActive) {
onActive();
}
if (LiveData.this.mActiveCount == 0 && !mActive) {
onInactive();
}
if (mActive) {
dispatchingValue(this);
}
}
在observeForever方法中调用wrapper.activeStateChanged(true),将其设置为常量true。
同比observer方法,是将生命周期拥有者传入,再进行观察,如果状态发生改变立刻调用activeStateChanged。
- removeObserver
void removeObserver (Observer<T> observer)
作用是移除指定的观察者
- removeObservers
void removeObservers (LifecycleOwner owner)
作用是移除指定的生命周期拥有者下的所有观察者
MutableLiveData和LiveData的区别
其实MutableLiveData的源码很简单
只有两个方法postValue和setValue,但是和LiveData的区别就在于是用public修饰的。
因此个人觉得会比LiveData方便一些。
关于postValue和setValue的机制简单理解
调用postValue后执行顺序
从这里可以看出调用了setValue
这里调用了观察者的onChanged方法,此时观察者可以接收到数据变化。
不足之处欢迎批评