LiveData原理分析

258 阅读3分钟

使用方法

LiveData可以看作是加上了生命周期的观察者模式实现。先看使用例子

private val data = MutableLiveData<User>()

data.observe(lifecycleOwner) {
    // TODO
}

// 发送数据
data.value = User()
// 异步发送数据
data.postValue(User())

源码分析

消费者

从observe看起,查看LiveData类中的observe方法

@MainThread
public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) {
    // 只能在主线程监听
    assertMainThread("observe");
    // 如果lifecycle已经销毁,直接返回,不监听
    if (owner.getLifecycle().getCurrentState() == DESTROYED) {
        // ignore
        return;
    }
    // 将LifecycleOwner和Observer封装一下
    LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);
    // 添加Observer到HashMap中
    ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);
    if (existing != null && !existing.isAttachedTo(owner)) {
        throw new IllegalArgumentException("Cannot add the same observer"
                + " with different lifecycles");
    }
    // 如果已经存在同样的Observer,直接返回
    if (existing != null) {
        return;
    }
    // 给lifecycle添加一个Observer
    owner.getLifecycle().addObserver(wrapper);
}

从上可以得到,LifecycleBoundObserver一定继承了LifecycleObserver

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() {
        // 关键代码,保证观察者收到值的时候,Activity一定是活跃的
        return mOwner.getLifecycle().getCurrentState().isAtLeast(STARTED);
    }

    @Override
    public void onStateChanged(@NonNull LifecycleOwner source,
            @NonNull Lifecycle.Event event) {
        Lifecycle.State currentState = mOwner.getLifecycle().getCurrentState();
        // Lifecycle状态为已经销毁,表示Activity已经销毁了
        if (currentState == DESTROYED) {
            // 移除监听
            removeObserver(mObserver);
            return;
        }
        Lifecycle.State prevState = null;
        while (prevState != currentState) {
            prevState = currentState;
            // 状态改变时,分发值
            activeStateChanged(shouldBeActive());
            currentState = mOwner.getLifecycle().getCurrentState();
        }
    }

    @Override
    boolean isAttachedTo(LifecycleOwner owner) {
        return mOwner == owner;
    }

    @Override
    void detachObserver() {
        mOwner.getLifecycle().removeObserver(this);
    }

LifecycleEventObserver实现

public interface LifecycleEventObserver extends LifecycleObserver {
    void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event);
}

从源码可以看到,LifecycleBoundObserver继承了存放了ObserverWrapper,实现了LifecycleEventObserver接口,并且存放了LifecycleOwner和Observer。
其中有一句关键代码是

mOwner.getLifecycle().getCurrentState().isAtLeast(STARTED)

用于保证消费者始终在Activity活跃的时候收到值。

再看ObserverWrapper类做了什么

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();

    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;
        changeActiveCounter(mActive ? 1 : -1);
        if (mActive) {
            // 分发值
            dispatchingValue(this);
        }
    }
}

大体功能是在状态改变时,调用dispatchingValue分发一下值,消费者分析到此结束,接下来分析设置了LiveData值后又做了哪些操作

生产者

  • 同步方式
@MainThread
protected void setValue(T value) {
    assertMainThread("setValue");
    // Version+1
    mVersion++;
    mData = value;
    dispatchingValue(null);
}

代码很简单,就是简单的设置了一下值,然后调用了dispatchingValue分发值,再翻翻dispatchingValue做了什么

void dispatchingValue(@Nullable ObserverWrapper initiator) {
    // 当前是否正在分发值,如果是,则直接返回
    if (mDispatchingValue) {
        mDispatchInvalidated = true;
        return;
    }
    mDispatchingValue = true;
    do {
        mDispatchInvalidated = false;
        // 第一次分发
        if (initiator != null) {
            considerNotify(initiator);
            initiator = null;
        } else {
            // 遍历Observer
            for (Iterator<Map.Entry<Observer<? super T>, ObserverWrapper>> iterator =
                    mObservers.iteratorWithAdditions(); iterator.hasNext(); ) {
                considerNotify(iterator.next().getValue());
                if (mDispatchInvalidated) {
                    break;
                }
            }
        }
    } while (mDispatchInvalidated);
    mDispatchingValue = false;
}

可以看到真正分发值的地方在considerNotify,再翻翻considerNotify方法

private void considerNotify(ObserverWrapper observer) {
    // 判断一下当前状态是否能分发值
    if (!observer.mActive) {
        return;
    }
    
    if (!observer.shouldBeActive()) {
        observer.activeStateChanged(false);
        return;
    }
    if (observer.mLastVersion >= mVersion) {
        return;
    }
    observer.mLastVersion = mVersion;
    observer.mObserver.onChanged((T) mData);
}

代码很简单,就是从ObserverWrapper中取出了Observer,调用它的onChanged方法,分发值。

再看看异步发送值是怎么处理的

  • 异步方式 postValue方法
protected void postValue(T value) {
    boolean postTask;
    synchronized (mDataLock) {
        postTask = mPendingData == NOT_SET;
        mPendingData = value;
    }
    if (!postTask) {
        return;
    }
    ArchTaskExecutor.getInstance().postToMainThread(mPostValueRunnable);
}

使用ArchTaskExecutor post了一个mPostValueRunnable到主线程,那么看看mPostValueRunnable内容

private final Runnable mPostValueRunnable = new Runnable() {
    @SuppressWarnings("unchecked")
    @Override
    public void run() {
        Object newValue;
        synchronized (mDataLock) {
            newValue = mPendingData;
            mPendingData = NOT_SET;
        }
        setValue((T) newValue);
    }
};

mPostValueRunnable中从mPendingData取出了value,然后调用了同步的setValue方法。至此LiveData实现原理基本完毕,代码比较简单,源码只有一个文件。