LiveData

作者: gczxbb | 来源:发表于2019-04-01 11:04 被阅读0次

    数据容器,并且可以感知生命周期。

    LiveData组件图

    LiveData 提供了一个 observe() 方法

    @MainThread
    public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) {
        assertMainThread("observe");
        if (owner.getLifecycle().getCurrentState() == DESTROYED) {
            return;
        }
        LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);
        //观察者注册
        ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);
        if (existing != null && !existing.isAttachedTo(owner)) {
        }
        if (existing != null) {
            return;
        }
        //注册到LifecycleRegistry,为了感知生命周期
        owner.getLifecycle().addObserver(wrapper);
    }
    

    它主要做两件事情

    1,定义一个 LifecycleObserver 注册到 Lifecycle ,观察生命周期,这里使用 LifecycleEventObserver 。

    2,用一个包装者类,封装 LiveData 中定义的 Observer ,将对应关系存入内部 Map。即子类 LifecycleBoundObserver。

    组件生命周期状态改变时
    首先通过 LifecycleEventObserver 感知,onStateChanged() 方法被调用,根据活动信息,交给 Wrapper 的 activeStateChanged() 统一处理,通知 Observer。

    @Override
    public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {
        if (mOwner.getLifecycle().getCurrentState() == DESTROYED) {
            removeObserver(mObserver);
            return;
        }
        activeStateChanged(shouldBeActive());
    }
    

    如果组件生命周期销毁,将 Observer 从 Map 移除,同时,解除 LifecycleEventObserver 观察者。
    因此,LiveData 可以感知生命周期。

    ObserverWrapper 的 activeStateChanged() 方法。

    
    void activeStateChanged(boolean newActive) {
        if (newActive == mActive) {
            return;
        }
        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);
        }
    }
    

    当组件活动时,做一次派发。
    LiveData 的 dispatchingValue() 方法,通过 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);
    }
    

    数据更新。
    mVersion,标记 Data 版本,每一次 setValue(),做一次升级。
    并不是每次生命周期活动都会走到 onChanged() 这一步。

    数据刷新时机

    总结:LiveData中的数据更新机制,setValue时,数据改变,根据Map通知所有Wrapper,被观察者感知,生命周期改变时,Wrapper 同步状态,必要时更新数据。


    任重而道远

    相关文章

      网友评论

          本文标题:LiveData

          本文链接:https://www.haomeiwen.com/subject/gkvpbqtx.html