LiveData源码解析

257 阅读1分钟

LiveData的基本介绍:

参见google官方文档

构造方法

liveData有无参和有参数两个构造方法

public LiveData(T value) {
    mData = value;
    mVersion = START_VERSION + 1;
}

public LiveData() {
    mData = NOT_SET;
    mVersion = START_VERSION;
}

可以看到liveData在构造函数给mDatamVersion这两个变量进行了赋值 查看一下使用和赋值的地方就可以知道mData是需要发送的数据源

observer.mObserver.onChanged((T) mData);

mVersion则是用来判断当前mData有没有被发送过

if (observer.mLastVersion >= mVersion) {
    return;
}
observer.mLastVersion = mVersion;

observe

看完了构造方法我们来看一下observe方法,也是LiveData最核心的方法 observe方法需要传入两个参数,一个LifecycleOwner一个Observer LifecycleOwner用来绑定生命周期,Observer为数据和生命周期变化观察者

@MainThread
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) {
    //判断是否是主线程
    assertMainThread("observe");
    if (owner.getLifecycle().getCurrentState() == DESTROYED) {
        // ignore
        return;
    }
    //构建一个LifecycleBoundObserver 用于观察生命周期
    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;
    }
    //添加观察者 观察生命周期变化
    owner.getLifecycle().addObserver(wrapper);
}

简单的流程图如下 image.png LiveData也提供了无需绑定生命周期的observeForever方法。

setValue

我们再来看一下LiveData的setValue方法

protected void setValue(T value) {
    assertMainThread("setValue");
    mVersion++;
    mData = value;
    dispatchingValue(null);
}

可以看到在对mData进行赋值后调用了dispatchingValue(null)

void dispatchingValue(@Nullable ObserverWrapper initiator) {
    // 判断是否有数据正在发送中
    if (mDispatchingValue) {
        mDispatchInvalidated = true;
        return;
    }
    mDispatchingValue = true;
    do {
        mDispatchInvalidated = false;
        // 传入观察者不为空直接通知该观察者更新
        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;
}