Jetpack - 认识LiveData

231 阅读3分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

简介

LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。

\

  • LiveData:绑定我们数据值的对象,我们可以通过setValue()postValue()来更新值,并告诉观察者当前值已经变化;而绑定观察者则是通过Observe()方法来执行;
  • Observer:它比较简单,就是一个观察者,用来感知LiveData值变化;
  • ObserverWrapper:它是LiveData的内部类,用来包装Observer并且有一个很重要的点,就是感知Activity、Fragment的生命周期,在合适的时候remove观察者,它的默认子类提供了两种LifecycleBoundObserverAlwaysActiveObserver,在接下来的源码分析阶段具体说下两种的区别。

LiveData源码分析

public abstract class LiveData<T> {
    // 默认版本为-1
    static final int START_VERSION = -1;
    // 观察者集合
    private SafeIterableMap<Observer<? super T>, ObserverWrapper> mObservers =
            new SafeIterableMap<>();

    private volatile Object mData;

    // 当前版本
    private int mVersion;
    
    private boolean mDispatchingValue;

    private boolean mDispatchInvalidated;
    
    // 用来更新postValue()传过来的值
    private final Runnable mPostValueRunnable = new Runnable() {
        @SuppressWarnings("unchecked")
        @Override
        public void run() {
            Object newValue;
            synchronized (mDataLock) {
                newValue = mPendingData;
                mPendingData = NOT_SET;
            }
            setValue((T) newValue);
        }
    };

    @SuppressWarnings("unchecked")
    private void considerNotify(ObserverWrapper observer) {
        // 非活跃状态直接return
        if (!observer.mActive) {
            return;
        }
        // Check latest state b4 dispatch. Maybe it changed state but we didn't get the event yet.
        //
        // we still first check observer.active to keep it as the entrance for events. So even if
        // the observer moved to an active state, if we've not received that event, we better not
        // notify for a more predictable notification order.
        if (!observer.shouldBeActive()) {
            observer.activeStateChanged(false);
            return;
        }
        // 比较LiveData和Observer的版本
        // mVersion是在setValue()时增加,正常情况mLastVersion一直比mVersion小
        if (observer.mLastVersion >= mVersion) {
            return;
        }
        // 更新mLastVersion
        observer.mLastVersion = mVersion;
        // 调用Observer.onChange()方法
        observer.mObserver.onChanged((T) mData);
    }

    // 分发值
    void dispatchingValue(@Nullable ObserverWrapper initiator) {
        if (mDispatchingValue) {
            mDispatchInvalidated = true;
            return;
        }
        mDispatchingValue = true;
        do {
            mDispatchInvalidated = false;
            // setValue()过来的initiator为空
            if (initiator != null) {
                considerNotify(initiator);
                initiator = null;
            } else {
                for (Iterator<Map.Entry<Observer<? super T>, ObserverWrapper>> iterator =
                        mObservers.iteratorWithAdditions(); iterator.hasNext(); ) {
                    considerNotify(iterator.next().getValue());
                    if (mDispatchInvalidated) {
                        break;
                    }
                }
            }
        } while (mDispatchInvalidated);
        mDispatchingValue = false;
    }

    @MainThread
    public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) {
        assertMainThread("observe");
        // 如果Activity、Fragment状态是Destroy,直接return
        if (owner.getLifecycle().getCurrentState() == DESTROYED) {
            // ignore
            return;
        }
        // 包装Observer
        LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);
        // 查看map是否已存在,不存在添加到map,如果存在直接return
        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;
        }
        // 将wrapper和Lifecycle绑定,用来感知生命周期变化
        owner.getLifecycle().addObserver(wrapper);
    }

    // 此方法和observe()不同的在于不考虑生命周期
    @MainThread
    public void observeForever(@NonNull Observer<? super T> observer) {
        assertMainThread("observeForever");
        AlwaysActiveObserver wrapper = new AlwaysActiveObserver(observer);
        ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);
        if (existing instanceof LiveData.LifecycleBoundObserver) {
            throw new IllegalArgumentException("Cannot add the same observer"
                    + " with different lifecycles");
        }
        if (existing != null) {
            return;
        }
        wrapper.activeStateChanged(true);
    }

    protected void postValue(T value) {
        boolean postTask;
        synchronized (mDataLock) {
            postTask = mPendingData == NOT_SET;
            mPendingData = value;
        }
        if (!postTask) {
            return;
        }
        // 移到主线程更新值,最终还是低啊用setValue()方法
        ArchTaskExecutor.getInstance().postToMainThread(mPostValueRunnable);
    }

    @MainThread
    protected void setValue(T value) {
        // 必须在主线程
        assertMainThread("setValue");
        // mVersion增加
        mVersion++;
        mData = value;
        // 分发值变化
        dispatchingValue(null);
    }
}
  • 第一步添加观察者observe(lifecycleOwner,Observer)LifecycleOwner是为了能够感知当前Owner生命周期变化,Observer是为了能够感知LiveData值变化;
  • 第二步更新LiveData值,主线程可使用setValue(T),子线程可使用postValue(T),在源码中我也作了注释,两种方式最终走到的还是setValue(T),紧接着后面会去分发这个更新的值,通过considerNotify(ObserverWrapper)逐一的调用每个Observer.onChange()方法。

ObserverWrapper

ObserverWrapper主要就是负责是否能够满足分发LiveData值变化。

private abstract class ObserverWrapper {
    final Observer<? super T> mObserver;
    boolean mActive;
    int mLastVersion = START_VERSION;

    ObserverWrapper(Observer<? super T> observer) {
        mObserver = observer;
    }

    // 应不应该处于活跃状态,主要就是为了防止后台依然更新数据
    abstract boolean shouldBeActive();

    // 是否attach到LifecycleOwner
    boolean isAttachedTo(LifecycleOwner owner) {
        return false;
    }

    void detachObserver() {
    }

    // LifecycleOwner活跃的状态是否改变,如果改变了需要重新分发下数据
    void activeStateChanged(boolean newActive) {
        if (newActive == mActive) {
            return;
        }
        // immediately set active state, so we'd never dispatch anything to inactive
        // owner
        mActive = newActive;
        changeActiveCounter(mActive ? 1 : -1);
        if (mActive) {
            dispatchingValue(this);
        }
    }
}

ObserverWarpper主要还是和LifecycleOwner相互关联,用来判断在什么状态之下才能去更新数据,在什么状态下需要移除观察者,比如LifecycleBoundObserver它只有在STARTEDRESUMED状态下才会去主动更新数据,其它状态暂时不会更新数据的,而在DESTROYED的状态下会去主动removeObserver()

文档

官方文档

LiveData版本