當(dāng)前為 2.3.1 版本
本文分析 LiveData 更新原理,涉及 LifecycleBoundObserver 綁定 Lifecycle 對生命周期變化進(jìn)行監(jiān)聽瓶蝴。
首先看 LiveData.ovserve() 方法
@MainThread
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) {
assertMainThread("observe");
if (owner.getLifecycle().getCurrentState() == DESTROYED) {
// 此處 return眨业,了解到 Glide 在 onDestroy() 后加載圖片拋出異常處理
return;
}
//1. LifecycleBoundObserver 為 LifecycleObserver
LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);
ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);
if (existing != null && !existing.isAttachedTo(owner)) {
throw new IllegalArgumentException("Cannot add the same observer"
+ " with different lifecycles");
}
if (existing != null) {
return;
}
//2. owner 獲取 Lifecycle 并跟 wrap 綁定,使得 wrapper 監(jiān)聽生命周期
owner.getLifecycle().addObserver(wrapper);
}
接下來看 LifecycleBoundObserver
class LifecycleBoundObserver extends ObserverWrapper implements LifecycleEventObserver {
@NonNull
final LifecycleOwner mOwner;
LifecycleBoundObserver(@NonNull LifecycleOwner owner, Observer<? super T> observer) {
super(observer);
mOwner = owner;
}
@Override
boolean shouldBeActive() {
//對應(yīng) onStart铣耘、onPause尖殃、onResume 狀態(tài),可以查看 Lifecycle.getTargetState() 方法 對應(yīng)生命周期 state 賦值情況
return mOwner.getLifecycle().getCurrentState().isAtLeast(STARTED);
}
//Activity\Fragment 生命周期變化會回調(diào)此方法屯耸。
@Override
public void onStateChanged(@NonNull LifecycleOwner source,
@NonNull Lifecycle.Event event) {
Lifecycle.State currentState = mOwner.getLifecycle().getCurrentState();
if (currentState == DESTROYED) {
//DESTROYED 移除監(jiān)聽
removeObserver(mObserver);
return;
}
Lifecycle.State prevState = null;
while (prevState != currentState) {
prevState = currentState;
//1.1 查看 shouldBeActive() 方法拐迁,如果是 onStart onResume onPause 狀態(tài)則判定活動狀態(tài),可更新值
//1.2 回到 ObserverWrapper.activeStateChanged() 方法
activeStateChanged(shouldBeActive());
currentState = mOwner.getLifecycle().getCurrentState();
}
}
@Override
boolean isAttachedTo(LifecycleOwner owner) {
return mOwner == owner;
}
@Override
void detachObserver() {
//移除監(jiān)聽
mOwner.getLifecycle().removeObserver(this);
}
}
ObserverWrapper.activeStateChanged 方法
private abstract class ObserverWrapper {
boolean mActive;
//保存當(dāng)前的監(jiān)聽值的版本疗绣,用于跟 LiveData 的版本比較线召,小于 LiveData 值的版本則需要更新。
int mLastVersion = START_VERSION;
void activeStateChanged(boolean newActive) {
if (newActive == mActive) {
return;
}
mActive = newActive;
changeActiveCounter(mActive ? 1 : -1);
//isAtLeast(STARTED)為true持痰,mActive 為 true灶搜,則繼續(xù)分發(fā) value
if (mActive) {
//1.3 回到 LiveData 的 dispatchingValue 方法。
dispatchingValue(this);
}
}
}
Livecycle state 賦值和活動狀態(tài)判斷如下
public abstract class Lifecycle {
@NonNull
public State getTargetState() {
switch (this) {
case ON_CREATE:
case ON_STOP:
return State.CREATED;
case ON_START:
case ON_PAUSE:
//STARTED 對應(yīng) onStart工窍、onPause 生命周期
return State.STARTED;
case ON_RESUME:
//RESUMED 對應(yīng) onResume 生命周期
return State.RESUMED;
case ON_DESTROY:
return State.DESTROYED;
case ON_ANY:
break;
}
}
//對應(yīng) State 類型
public enum State {
DESTROYED,
INITIALIZED,
CREATED,
STARTED,
RESUMED;
// isAtLeast(STARTED) 最小為 STARTED割卖、RESUMED 狀態(tài),對應(yīng)生命周期如上
public boolean isAtLeast(@NonNull State state) {
return compareTo(state) >= 0;
}
}
}
回到 LiveData.dispatchingValue()
void dispatchingValue(@Nullable ObserverWrapper initiator) {
...
do {
if (initiator != null) {
//1.4
considerNotify(initiator);
initiator = null;
} else {
...
}
} while (mDispatchInvalidated);
mDispatchingValue = false;
}
private void considerNotify(ObserverWrapper observer) {
if (!observer.mActive) {
return;
}
if (!observer.shouldBeActive()) {
observer.activeStateChanged(false);
return;
}
//重要;汲E羲荨!淹仑,observer 跟 LiveData 分別保存數(shù)據(jù)的 version 值丙挽,沒修改一次 value,則版本號 +1
//當(dāng) LiveData 的版本號 大于 observer 的版本號匀借,則說明需要監(jiān)聽的值修改颜阐,則回調(diào)監(jiān)聽
if (observer.mLastVersion >= mVersion) {
return;
}
observer.mLastVersion = mVersion;
//1.5 回調(diào)監(jiān)聽,即完成監(jiān)聽
observer.mObserver.onChanged((T) mData);
}
以上流程分析了調(diào)用 observe 方法時吓肋,LiveData 內(nèi)部創(chuàng)建 LifecycleBoundObserver 對象凳怨,該對象實(shí)現(xiàn) LifecycleObserver 接口并注冊 Livecycle 實(shí)現(xiàn)對生命周期變化監(jiān)聽。
當(dāng)生命周期變化時候,在 LifecycleBoundObserver 中判斷是否在活動狀態(tài)肤舞,即 onStart紫新、onResume、onPause 狀態(tài)李剖,如果是芒率,則依次調(diào)用 dispatchingValue () -> considerNotify() 方法,當(dāng)值的 version 未改變則 return篙顺,當(dāng)判定 version 已經(jīng)改變了偶芍,則回調(diào) Observer.onChanged 完成監(jiān)聽。
下面來看主動調(diào)用 LiveData.setValue() 監(jiān)聽
protected void setValue(T value) {
assertMainThread("setValue");
//版本++
mVersion++;
mData = value;
//繼續(xù)分發(fā)慰安,回到上面的流程
dispatchingValue(null);
}
postValue 是通過 Handler 發(fā)送 Runnable 到主線程繼續(xù)執(zhí)行 setValue 的過程腋寨。
注意:
數(shù)據(jù)倒灌問題:如果先執(zhí)行 LiveData.setValue() 再調(diào)用 observe 監(jiān)聽,此時 LiveData mVersion 已經(jīng)改變?yōu)?化焕,ObserverWrapper 的 mLastVersion 還是為 -1,所以訂閱時仍會收到 onChanged 回調(diào)铃剔∪鼋埃可以使用 SingleLiveEvent 避免。