LiveData源码

自己看,如果不对,请指出!


package androidx.lifecycle;

import static androidx.lifecycle.Lifecycle.State.DESTROYED;
import static androidx.lifecycle.Lifecycle.State.STARTED;

import androidx.annotation.MainThread;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.arch.core.executor.ArchTaskExecutor;
import androidx.arch.core.internal.SafeIterableMap;

import java.util.Iterator;
import java.util.Map;

public abstract class LiveData<T> {
    
    // 用于synchronized同步处理的数据对象
    @SuppressWarnings("WeakerAccess") /* synthetic access */
    final Object mDataLock = new Object();
    
    // 当前持有数据的版本号,默认为-1
    static final int START_VERSION = -1;
    
    // 定义当mData没有数据时的默认数据
    @SuppressWarnings("WeakerAccess") /* synthetic access */
    static final Object NOT_SET = new Object();

    // 用于存储全部的Observer对象的安全迭代Map
    // SafeIterableMap一个能在遍历中删除元素的数据结构
    private SafeIterableMap<Observer<? super T>, ObserverWrapper> mObservers =
            new SafeIterableMap<>();

    // 记录有多少个Active状态的Observer
    @SuppressWarnings("WeakerAccess") /* synthetic access */
    int mActiveCount = 0;
   
    // 用于处理Active\InActive状态
    private boolean mChangingActiveState;
    
    // 真实数据
    private volatile Object mData;
    
    // 当setData被调用, 在主线程进行pending数据和实际数据的交换
    @SuppressWarnings("WeakerAccess") /* synthetic access */
    volatile Object mPendingData = NOT_SET;
    
    // 当前持有数据的版本号
    private int mVersion;

    // 记录在遍历通知各ObserverWrapper期间,数据是否发生变化
    private boolean mDispatchingValue;
    
    // 记录判断是否数据分发无效
    @SuppressWarnings("FieldCanBeLocal")
    private boolean mDispatchInvalidated;
    
    // postValue()函数调用的Runnable
    private final Runnable mPostValueRunnable = new Runnable() {
        @SuppressWarnings("unchecked")
        @Override
        public void run() {
            // 定义新的value
            Object newValue;
            // 同步处理
            synchronized (mDataLock) {
                // 新的value设置为mPendingData
                newValue = mPendingData;
                // mPendingData更新为默认数据
                mPendingData = NOT_SET;
            }
            // 调用setValue()
            setValue((T) newValue);
        }
    };

    /**
     * 有参数的构造函数
     *
     * @param value initial value
     */
    public LiveData(T value) {
        // 实际数据设置为参数传递的数据
        mData = value;
        // 当前持有的数据版本号从-1变为0
        mVersion = START_VERSION + 1;
    }

    /**
     * 无参构造函数
     */
    public LiveData() {
        // 实际数据设置为默认数据
        mData = NOT_SET;
        // 当前版本设置为-1
        mVersion = START_VERSION;
    }

    // 实际更新数据的方法,判断是否需要将数据分发到指定的ObserverWrapper
    @SuppressWarnings("unchecked")
    private void considerNotify(ObserverWrapper observer) {
        // 判断指定的observer是否是Active状态,不是则返回
        if (!observer.mActive) {
            return;
        }
        // 再次确认observer的最新状态,因为有可能生命周期实际上已经变化了,但是Active状态还没改变
        if (!observer.shouldBeActive()) {
            // 如果当前的observer不是Active状态,处于InActive状态,则不进行数据分发,并返回
            observer.activeStateChanged(false);
            return;
        }
        // 判断observer所持有的的版本是不是最新版本,如果是最新版本,则返回
        if (observer.mLastVersion >= mVersion) {
            return;
        }
        // 否则observer的版本就是当前最新版本
        observer.mLastVersion = mVersion;
        // observer通知新数据更新
        observer.mObserver.onChanged((T) mData);
    }

    // 将数据通知给observer
    @SuppressWarnings("WeakerAccess") /* synthetic access */
    void dispatchingValue(@Nullable ObserverWrapper initiator) {
        // 如果在遍历OberverWrapper期间,如果数据发生改变,则会重新遍历通知
        if (mDispatchingValue) {
            // 如果数据发生变化,则分发无效
            mDispatchInvalidated = true;
            return;
        }
        // 设置数据发生变化标识为true
        mDispatchingValue = true;
        do {
            // 分发无效标记设为false
            mDispatchInvalidated = false;
            // 如果传入的initiator不是空的,就只通知特定的ObserWrapper即可,如果是空的,就通知所有的
            if (initiator != null) {
                // 进行实际数据分发
                considerNotify(initiator);
                // initiator对象置空
                initiator = null;
            } else {
                // 遍历所有的ObserverWrapper对象
                for (Iterator<Map.Entry<Observer<? super T>, ObserverWrapper>> iterator =
                        mObservers.iteratorWithAdditions(); iterator.hasNext(); ) {
                    // 进行实际数据分发
                    considerNotify(iterator.next().getValue());
                    // 如果期间数据发生了变化,则中断for循环数据分发处理
                    if (mDispatchInvalidated) {
                        break;
                    }
                }
            }
            // 如果数据无效标识为true,则do...while进行重新遍历,通知ObserWrapper进行数据分发
        } while (mDispatchInvalidated);
        mDispatchingValue = false;
    }

    // 注册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);
        // 判断传入的Map中是否已经存在observer,如果存在则返回对象,否则添加并返回空
        ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);
        // 如果已经存在于map中,并且owner不同,则抛出异常
        if (existing != null && !existing.isAttachedTo(owner)) {
            throw new IllegalArgumentException("Cannot add the same observer"
                    + " with different lifecycles");
        }
        // 如果存在于map中,则返回
        if (existing != null) {
            return;
        }
        // 如果existing为空,map中不存在,则追加,从而实现对LifecycleOwner生命周期的感知
        owner.getLifecycle().addObserver(wrapper);
    }

    // 永久观察,不在乎生命周期,只要数据发生变化,就会通知Observer
    @MainThread
    public void observeForever(@NonNull Observer<? super T> observer) {
        // 判断是否是主线程,不是则抛出异常
        assertMainThread("observeForever");
        // 创建AlwaysActiveObserver对象
        AlwaysActiveObserver wrapper = new AlwaysActiveObserver(observer);
        // 判断传入的Map中是否已经存在observer,如果存在则返回对象,否则添加并返回空
        ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);
        // 判断map中存在Observer的类型,如果类型是LifecycleBoundObserver,不是AlwaysActiveObserver,则抛出异常
        if (existing instanceof LiveData.LifecycleBoundObserver) {
            throw new IllegalArgumentException("Cannot add the same observer"
                    + " with different lifecycles");
        }
        // 如果map中存在则返回
        if (existing != null) {
            return;
        }
        // 直接分发数据
        wrapper.activeStateChanged(true);
    }

    // 移除现有的Observer
    @MainThread
    public void removeObserver(@NonNull final Observer<? super T> observer) {
        // 判断是否是主线程
        assertMainThread("removeObserver");
        // 移除observer对象
        ObserverWrapper removed = mObservers.remove(observer);
        // 如果map中不存在则返回
        if (removed == null) {
            return;
        }
        // 通知生命周期持有者移除
        removed.detachObserver();
        // 不在分发数据
        removed.activeStateChanged(false);
    }

    // 移除指定生命周期持有者对应的Observer
    @SuppressWarnings("WeakerAccess")
    @MainThread
    public void removeObservers(@NonNull final LifecycleOwner owner) {
        // 判断是否是主线程
        assertMainThread("removeObservers");
        // 遍历
        for (Map.Entry<Observer<? super T>, ObserverWrapper> entry : mObservers) {
            // 判断是否owner一致
            if (entry.getValue().isAttachedTo(owner)) {
                // 移除
                removeObserver(entry.getKey());
            }
        }
    }

    /**
     * 子线程处理,最终还是通过setValue函数使用主线程进行分发数据
     * 
     * liveData.postValue("a");
     * liveData.setValue("b");
     * "b"会被setValue函数首先设置,随后会在主线程被"a"覆盖
     *
     * 如果在主线程执行post之前,多次调用该函数,那么只有最后一个值会被分发
     */
    protected void postValue(T value) {
        // 创建标识
        boolean postTask;
        // 同步处理
        synchronized (mDataLock) {
            // mPendingData是否是默认值
            postTask = mPendingData == NOT_SET;
            // 将mPendingData设置为传入的value
            mPendingData = value;
        }
        // 如果mPendingData不是默认值,则返回
        if (!postTask) {
            return;
        }
        // 主线程执行mPostValueRunnable
        ArchTaskExecutor.getInstance().postToMainThread(mPostValueRunnable);
    }

    /**
     * 设置数据,并且直接分发
     * 必须主线程调用
     */
    @MainThread
    protected void setValue(T value) {
        // 判断是否在主线程
        assertMainThread("setValue");
        // 当前持有数据版本高号加1
        mVersion++;
        // 实际数据设置为传递的参数
        mData = value;
        // 分发数据,并且参数传递为null,通知所有Observer
        dispatchingValue(null);
    }

    /**
     * 获取当前数据.
     * 如果在子线程调用,有可能获取的并不是最新的数据
     */
    @SuppressWarnings("unchecked")
    @Nullable
    public T getValue() {
        // 创建临时变量,用于返回
        Object data = mData;
        // 当数据不是默认值的情况返回,否则返回空
        if (data != NOT_SET) {
            return (T) data;
        }
        return null;
    }

    // 获取当前数据版本
    int getVersion() {
        return mVersion;
    }

    /**
     * 当观察者数量从0变为1时调用.
     */
    protected void onActive() {

    }

    /**
     * 当观察者数量从1变为0时调用.
     * 并不意味这当前没有Observer了,只是观察者可能不处于STARTED或者RESUMED状态,例如Activity在后台
     * 可以使用hasObservers检查当前是否还有observer
     */
    protected void onInactive() {
        
    }

    /**
     * 判断当前是否还有Observer
     */
    @SuppressWarnings("WeakerAccess")
    public boolean hasObservers() {
        return mObservers.size() > 0;
    }

    /**
     * 判断当前是否还有处于Active状态的Observer
     */
    @SuppressWarnings("WeakerAccess")
    public boolean hasActiveObservers() {
        return mActiveCount > 0;
    }

    // 更新Active状态Observer的数量
    @MainThread
    void changeActiveCounter(int change) {
        // 将之前的数量保存到局部变量中
        int previousActiveCount = mActiveCount;
        // 当前数量追加
        mActiveCount += change;
        // 当前是否处于Active状态,是Active状态则返回
        if (mChangingActiveState) {
            return;
        }
        // 否则设置为true
        mChangingActiveState = true;
        try {
            // 判断新旧数量是否一致
            while (previousActiveCount != mActiveCount) {
                // 之前没有,现在有了
                boolean needToCallActive = previousActiveCount == 0 && mActiveCount > 0;
                // 之前有,现在没有了
                boolean needToCallInactive = previousActiveCount > 0 && mActiveCount == 0;
                // 局部变量和当前保持一致了
                previousActiveCount = mActiveCount;
                if (needToCallActive) {
                    // 代表增加了
                    onActive();
                } else if (needToCallInactive) {
                    // 代表清空了
                    onInactive();
                }
            }
        } finally {
            // 将状态设置为false
            mChangingActiveState = false;
        }
    }

    // 将LifecycleObserver和ObserverWrapper进行关联,当生命周期发生改变,通知ObserverWrapper进行更新
    class LifecycleBoundObserver extends ObserverWrapper implements LifecycleEventObserver {
        
        // 生命周期持有者对象
        @NonNull
        final LifecycleOwner mOwner;

        // 构造函数
        LifecycleBoundObserver(@NonNull LifecycleOwner owner, Observer<? super T> observer) {
            super(observer);
            // 生命周期持有者赋值
            mOwner = owner;
        }

        // 判断是否处于Active状态
        // DESTROYED,
        // INITIALIZED,
        // CREATED,
        // STARTED,
        // RESUMED;
        // STARTED和RESUMED算是Active
        @Override
        boolean shouldBeActive() {
            return mOwner.getLifecycle().getCurrentState().isAtLeast(STARTED);
        }

        // 接收生命周期变化的回调
        @Override
        public void onStateChanged(@NonNull LifecycleOwner source,
                @NonNull Lifecycle.Event event) {
            // 获取当前生命周期的状态
            Lifecycle.State currentState = mOwner.getLifecycle().getCurrentState();
            if (currentState == DESTROYED) {
                // 如果是destoryed则移除观察者,并返回
                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;
        }

        // 移除Observer
        @Override
        void detachObserver() {
            mOwner.getLifecycle().removeObserver(this);
        }
    }

    // 抽象类ObserWrapper,用于LifecycleBoundObserver和AlwaysActiveObserver
    private abstract class ObserverWrapper {
        // 观察者对象
        final Observer<? super T> mObserver;
        // 状态
        boolean mActive;
        // 版本号
        int mLastVersion = START_VERSION;

        // 构造函数
        ObserverWrapper(Observer<? super T> observer) {
            mObserver = observer;
        }

        // 抽象函数,判断生命周期持有者当前状态,给到LifecycleBoundObserver和AlwaysActiveObserver
        abstract boolean shouldBeActive();

        // LifecycleBoundObserver用于判断生命周期持有者
        boolean isAttachedTo(LifecycleOwner owner) {
            return false;
        }

        // LifecycleBoundObserver用于移除Observer
        void detachObserver() {
        }

        // 状态改变
        void activeStateChanged(boolean newActive) {
            // 如果状态一致则返回
            if (newActive == mActive) {
                return;
            }
            // 立即设置活动状态,这样我们就不会向非活动所有者发送任何内容
            mActive = newActive;
            changeActiveCounter(mActive ? 1 : -1);
            if (mActive) {
                // 活动状态,分发数据
                dispatchingValue(this);
            }
        }
    }

    // 无视生命周期的观察者
    private class AlwaysActiveObserver extends ObserverWrapper {

        // 构造函数
        AlwaysActiveObserver(Observer<? super T> observer) {
            super(observer);
        }

        // 无视生命周期,直接返回true
        @Override
        boolean shouldBeActive() {
            return true;
        }
    }

    // 线程判断
    static void assertMainThread(String methodName) {
        if (!ArchTaskExecutor.getInstance().isMainThread()) {
            throw new IllegalStateException("Cannot invoke " + methodName + " on a background"
                    + " thread");
        }
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容