/** * LiveData是抽象类,MutableLiveData是具体实现类
*/
private MutableLiveData<String> mCurrentText; public MutableLiveData<String> getCurrentText() { if (mCurrentText == null) { mCurrentText = new MutableLiveData<>(); } return mCurrentText; }}``` LifecycleBoundObserver(@NonNull LifecycleOwner owner, Observer<T> observer) { super(observer); mOwner = owner; } @Override boolean shouldBeActive() { return mOwner.getLifecycle().getCurrentState().isAtLeast(STARTED); } @Override public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) { if (mOwner.getLifecycle().getCurrentState() == DESTROYED) { // 当接收到 DESTROYED 的事件会自动解除跟 owner 的绑定 removeObserver(mObserver); return; } activeStateChanged(shouldBeActive()); } @Override boolean isAttachedTo(LifecycleOwner owner) { return mOwner == owner; } @Override void detachObserver() { mOwner.getLifecycle().removeObserver(this); }}//抽象类private abstract class ObserverWrapper { final Observer<T> mObserver; boolean mActive; int mLastVersion = START_VERSION; ObserverWrapper(Observer<T> observer) { mObserver = observer; } abstract boolean shouldBeActive(); boolean isAttachedTo(LifecycleOwner owner) { return false; } void detachObserver() { } 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); } } }//接口public interface GenericLifecycleObserver extends LifecycleObserver { /** * Called when a state transition event happens.
*
* @param source The source of the event
* @param event The event
*/
void onStateChanged(LifecycleOwner source, Lifecycle.Event event);
}
```通过上面的代码可以发现什么?GenericLifecycleObserver是一个接口,ObserverWrapper是一个抽象类,而LifecycleBoundObserver则是ObserverWrapper的子类,并且重写了其中几个方法;在LifecycleBoundObserver的shouldBeActive()方法,在 owner 处于至少是 STARTED 的状态下认为是 active 状态;而且它也实现了 GenericLifecycleObserver 接口,可以监听 lifecycle 回调。在 onStateChanged() 方法里处理了生命周期改变的事件,在这个方法中,当接收到 DESTROYED 的事件会自动解除跟 owner 的绑定;将下个流程交给了 activeStateChanged(),这里具体可以看抽象类ObserverWrapper中的activeStateChanged源码;看一下ObserverWrapper抽象类中activeStateChanged方法中,onActive和onInactive分别干什么呢?对于onActive方法,当活动观察者的数量从0变为1时调用;对于onInactive方法,当活动观察者的数量从1变为0时调用if (wasInactive && mActive) {
onActive();
}
if (LiveData.this.mActiveCount == 0 && !mActive) {
onInactive();
}看一下ObserverWrapper抽象类中activeStateChanged方法中,dispatchingValue是干什么呢?这个方法在分析下面setValue源码时还会说到,具体看下面的介绍!//在SafeIterableMap类中的putIfAbsent方法public V putIfAbsent(@NonNull K key, @NonNull V v) { Entry<K, V> entry = get(key); if (entry != null) { return entry.mValue; } put(key, v); return null;}protected Entry<K, V> put(@NonNull K key, @NonNull V v) { Entry<K, V> newEntry = new Entry<>(key, v); mSize++; if (mEnd == null) { mStart = newEntry; mEnd = mStart; return newEntry; } mEnd.mNext = newEntry; newEntry.mPrevious = mEnd; mEnd = newEntry; return newEntry;}``` //注意认真看下面的代码 if (observer.mLastVersion >= mVersion) { return; } observer.mLastVersion = mVersion; //noinspection unchecked observer.mObserver.onChanged((T) mData);}```

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。