Android LiveData我的理解

LiveData用大衆語言來來講,是一個觀察者,也是一個數據持有類或者可以稱爲一個數據的包裹類。它有別於其他的觀察者的重點是,他具有生命週期感知能力,這裏生命週期指的是activities, fragments, or services 的生命週期。

講到LiveData,就想到DataBinding,想到MVVM。LiveData的確一開始是爲這種模式而設計出來的。LiveData搞懂,可以說了解了MVVM的一半了。

 

說到LiveData擁有生命週期感知能力,那麼如何實現。自己手寫代碼在onCreate、onStart、onResume這些方法里加入邏輯當然是一種方法,但這不夠靈活不夠解耦。所以在Android Support Library 26.1.0 開始,引入Lifecycles。

那麼Lifecycles是什麼?

可以理解爲一個庫或一堆類,加上在Activity、Fragment裏面插入的一些邏輯代碼,最終實現的生命週期可以通知到外界的體系。

 

像觀察者模式一樣。可以分爲註冊、反註冊、發送事件和接受事件這4部分。

先來看發送部分。

發送部分(處於源碼裏面)

上面這個圖以 android.support.v4.app.Fragment.java 爲例,可以看到從8.1.0開始,在 performCreate、performStart、performResume、performPause、performStop 和 performDestroy 等方法都加上了發送生命週期 Event 事件。

 

Activity 發送生命週期 Event 會複雜一點,是在 android.support.v4.app.SupportActivity 裏通過創建一個 ReportFragment,把在各個生命週期中發事件的代碼邏輯挪進去 ReportFragment 裏實現的。

這一招數讓我想起了 Glide 對於圖片生命週期的管理。Glide.with(Activity) 也是讓 Activity 創建出一個 Fragment ,在 Fragment 的各個生命週期方法內插入回調函數後,執行代碼來實現的。

SupportActivity.java(support庫)
------------------------------
    @Override
    @SuppressWarnings("RestrictedApi")
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ReportFragment.injectIfNeededIn(this);
    }


ComponentActivity.java(androidx庫)
------------------------------
    @Override
    @SuppressWarnings("RestrictedApi")
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ReportFragment.injectIfNeededIn(this);
    }


ReportFragment.java
------------------------------
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        dispatchCreate(mProcessListener);
        dispatch(Lifecycle.Event.ON_CREATE);
    }

    @Override
    public void onStart() {
        super.onStart();
        dispatchStart(mProcessListener);
        dispatch(Lifecycle.Event.ON_START);
    }

    @Override
    public void onResume() {
        super.onResume();
        dispatchResume(mProcessListener);
        dispatch(Lifecycle.Event.ON_RESUME);
    }

    @Override
    public void onPause() {
        super.onPause();
        dispatch(Lifecycle.Event.ON_PAUSE);
    }

    @Override
    public void onStop() {
        super.onStop();
        dispatch(Lifecycle.Event.ON_STOP);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        dispatch(Lifecycle.Event.ON_DESTROY);
        // just want to be sure that we won't leak reference to an activity
        mProcessListener = null;
    }

    private void dispatch(Lifecycle.Event event) {
        Activity activity = getActivity();
        if (activity instanceof LifecycleRegistryOwner) {
            ((LifecycleRegistryOwner) activity).getLifecycle().handleLifecycleEvent(event);
            return;
        }

        if (activity instanceof LifecycleOwner) {
            Lifecycle lifecycle = ((LifecycleOwner) activity).getLifecycle();
            if (lifecycle instanceof LifecycleRegistry) {
                ((LifecycleRegistry) lifecycle).handleLifecycleEvent(event);
            }
        }
    }

Activity 和 Fragment 都會調用到 LifecycleRegistry.handleLifecycleEvent(event) 方法。

LifecycleRegistry 是在 ComponentActivity 和 Fragment 中聲明並且直接new出來的成員變量。

同時它們還是實現了 LifecycleOwner 接口,裏面的 getLifecycle() 就是返回這個 mLifecycleRegistry 用的。

SupportActivity.java(用於support庫)
------------------------------
public class SupportActivity extends Activity implements LifecycleOwner {

    private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);


ComponentActivity.java(用於androidx庫)
------------------------------
public class ComponentActivity extends Activity
        implements LifecycleOwner, KeyEventDispatcher.Component {

    private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);


Fragment.java
------------------------------
public class Fragment implements ComponentCallbacks, OnCreateContextMenuListener, LifecycleOwner {

    LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);





LifecycleOwner.java
------------------------------
public interface LifecycleOwner {
    @NonNull
    Lifecycle getLifecycle();
}

用了 LifecycleRegistry 來管理註冊到Activity或Fragment來的所有觀察者。包括添加、刪除觀察者,接受生命週期事件並分發到各個觀察者中。

LifecycleRegistry 會維護一個 State 變量。同時這些觀察者 ObserverWithState 也會有維護一份屬於自己的聲明週期狀態 State。

這兩份 State 的作用是,兩者比較後,可以決定觀察者列表「從前往後遍歷」還是「從後往前遍歷」。爲什麼要分「從前往後遍歷」還是「從後往前遍歷」我猜可能是一些觀察者要遵循棧的後進先出原則吧,後註冊的一些觀察者組件需要先進行反註冊操作。

 

下面這圖是Lifecycles體系裏面 State 和 Event 的關係。

 

 

LifecycleRegistry.handleLifecycleEvent(event) 之後接着是

 LifecycleRegistry.sync() 方法,接着是

backwardPass() 或者 forwardPass(),代表從後往前遍歷還是從前往後遍歷。

在裏面會遍歷 LifecycleRegistry 的成員變量 mObserverMap,這個 Map 就是該 Activity/Fragment 生命週期的觀察者。遍歷 Map 後逐個調用 ObserverWithState.dispatchEvent(),最後執行 GenericLifecycleObserver.onStateChanged()。即逐個通知到觀察者,當前 Activity/Fragment 處於哪個生命週期裏了。

 

註冊、反註冊和接受通知(處於源碼外面,需要開發者寫)

說完發送生命週期通知事件後,就該講在外面我們如何使用觀察者監聽通知了,包括註冊、反註冊和接受通知。

簡單寫法一般有這麼兩種,這是第一種,註解聲明只接受 ON_RESUME 事件通知

這是第二種

註冊後可以成功收到相應事件。看logcat日誌,我把一個MainActivity打開又關閉後,輸出了這些日誌。

ps:GenericLifecycleObserver 下面報紅了,因爲這個類上面的註解說明了,這個類只應該在自己的library 裏面使用。可以忽略這個警告。看 GenericLifecycleObserver 頭像的註解,如下圖

 

LiveData

下面要講回LiveData了,文章一開始介紹了了LiveData是什麼。它是一個基於觀察者模式的數據的包裹類,最重要的特點是生命週期感知能力。

怎麼實現生命週期感知能力,其實就是內部幫我們封裝了 Lifecycles 的「註冊」、「反註冊」和「接受生命週期事件,並且做出相應處理」的代碼。

下圖是 LiveData 的基本使用。

LiveData 執行 observe() 方法後,傳入當前 Activity 和 回調方法。

註冊(LiveData的註冊生命週期)

LiveData.java
------------------------------
    @MainThread
    public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) {
        assertMainThread("observe");
        if (owner.getLifecycle().getCurrentState() == DESTROYED) {
            // ignore
            return;
        }
        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;
        }
        
        //通過activity獲取LifecycleRegistry,將回調方法封裝成一個LifecycleBoundObserver傳進去
        owner.getLifecycle().addObserver(wrapper);
    }

可以看到,LiveData 裏面的註冊 Lifecycles 流程在這個 observe 方法裏。

owner.getLifecycle() 就是在 Activity/Fragment 中獲取到 LifecycleRegistry。將回調方法封裝成一個 LifecycleBoundObserver 實體後註冊到 Activity/Fragment 的功能。

 

反註冊(LiveData的反註冊生命週期)

LifecycleBoundObserver 中提供了一個 detachObserver() 方法,只有這個方法裏面,會進行生命週期的反註冊功能。

    @MainThread
    public void removeObserver(@NonNull final Observer<? super T> observer) {
        //判斷如果不是主線程則拋異常
        assertMainThread("removeObserver");

        //mObservers 是屬於這個 LiveData 的觀察者集合,需要從集合裏刪除這個觀察者
        ObserverWrapper removed = mObservers.remove(observer);
        if (removed == null) {
            return;
        }

        //這個 removed 變量的聲明是 ObserverWrapper 類型。這是個抽象類,無法實例化。
        //實際只能是 AlwaysActiveObserver 或者 LifecycleBoundObserver 兩種類型。
        //1.如果是 AlwaysActiveObserver 類型,沒有重寫 detachObserver() 方法。
        //因爲這是屬於 observeForever 的邏輯,永久觀察當然不用處於聲明週期方面的功能。
        //2.如果是 LifecycleBoundObserver 類型,則重寫了 detachObserver() 方法。
        //用於讓 owner 移除這個觀察者。
        removed.detachObserver();
        
        //因爲移除了一個觀察者,可能使得 LiveData 的活躍觀察者從1變0,所以需要通知一下。
        removed.activeStateChanged(false);
    }

    @SuppressWarnings("WeakerAccess")
    @MainThread
    public void removeObservers(@NonNull final LifecycleOwner owner) {
        assertMainThread("removeObservers");
        for (Map.Entry<Observer<? super T>, ObserverWrapper> entry : mObservers) {
            if (entry.getValue().isAttachedTo(owner)) {
                removeObserver(entry.getKey());
            }
        }
    }


    class LifecycleBoundObserver extends ObserverWrapper implements GenericLifecycleObserver {
        @NonNull
        final LifecycleOwner mOwner;

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

這裏的 detachObserver() 方法在 LiveData.removeObservers(Observer<T>) 和 LiveData.removeObservers(LifecycleOwner) 中調用的。

LiveData.removeObservers(LifecycleOwner) 內部也是調用的 LiveData.removeObservers(Observer<T>)。讓我們先捋清楚 removeObserver(Observer<? super T>) 幹了些什麼事情。

幹得四件事如代碼註釋所寫。

那麼 LiveData.removeObservers(Observer<T>) 在什麼時候調用呢?

LiveData.removeObservers(Observer<T>) 其實是在接受生命週期回調的 onStateChanged(LifecycleOwner, Lifecycle.Event) 方法中,會判斷如果是如果當前 owner 處於 DESTROYED 狀態就執行。LiveData 是用的此種方法讓它具有了自動反註冊功能。下面請看 LiveData 如何接受生命週期事件。

 

 

接受生命週期事件並且做出相應處理

LifecycleBoundObserver.java
------------------------------
class LifecycleBoundObserver extends ObserverWrapper implements GenericLifecycleObserver {

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

    @Override
    boolean shouldBeActive() {
        return mOwner.getLifecycle().getCurrentState().isAtLeast(STARTED);
    }


ObserverWrapper.java
------------------------------
private abstract class ObserverWrapper {

    void activeStateChanged(boolean newActive) {
        if (newActive == mActive) {
            return;
        }
        // immediately set active state, so we'd never dispatch anything to inactive
        // owner
        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);
        }
    }

我們知道 LifecycleOwner 發送的生命週期事件會經過層層調用,最後到 GenericLifecycleObserver.onStateChanged(LifecycleOwner, Lifecycle.Event)。

在這裏體現在子類 LifecycleBoundObserver.onStateChanged(LifecycleOwner, Lifecycle.Event)。

方法裏第一步會判斷是 DESTROYED 事件則進行 LiveData 反註冊方面的操作。

第二步是調用了 ObserverWrapper.activeStateChanged(boolean) 方法。

 

方法裏傳了一個布爾值,表示當前 owner 的是否處於 Active 活躍狀態。在這裏意思是 State 爲 STARTED 或 RESUMED 纔算活躍。

方法裏判斷,如果當前狀態 和 新傳進來的狀態一樣,直接 return 了。只有不一樣纔會往下執行。

第一步會修改 mActiveCount 變量,表示當前 LiveData 所關聯的 owner 有多少個是活躍的。

第二步是根據之前的 Active 狀態,和新傳進來的 Active 狀態,判斷是否需要執行

LiveData.onActive()  活躍觀察者數量從0變成1

LiveData.onInactive()  活躍觀察者數量從1變成0

以及最重要的第三步!如果是狀態是從不活躍到活躍,則立即派發一輪事件到各個觀察者中。達到的就是 粘性廣播 或 粘性EventBus 那樣的效果。

關於派發事件 dispatchingValue 方法留到下面講。

以上就是 LiveData 封裝好的 Lifecycles 的「註冊」、「反註冊」和「接受生命週期事件,並且做出相應處理」的代碼。

 

下面講下 LiveData 關於數據方面的操作,包括修改數據 和 數據修改後的回調操作(比如 DataBinding 的更新UI操作)。

開發者如何使用 LiveData 

LiveData.java
------------------------------
    @MainThread
    public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<? super T> observer) {
        assertMainThread("observe");
        if (owner.getLifecycle().getCurrentState() == DESTROYED) {
            // ignore
            return;
        }
        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);
    }

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

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

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

    @Nullable
    public T getValue() {
        Object data = mData;
        if (data != NOT_SET) {
            //noinspection unchecked
            return (T) data;
        }
        return null;
    }

observe(LifecycleOwner, Observer<? super T>) 是在 LiveData 裏註冊一個觀察者,如果數據發生變化會通知這些觀察者。

setValue(T) 用於在主線程裏面修改數據

postValue(T) 用於在子線程裏面修改數據,當然最終還是會調到到 setValue(T) 

getValue(T) 就是get方法很好理解吧,在簡單流程裏使用是不需要用到的,像在Android DataBinding架構裏纔會用到。

setValue(T) 最終調用到 dispatchingValue()

    private SafeIterableMap<Observer<? super T>, ObserverWrapper> mObservers =
            new SafeIterableMap<>();

    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;
    }

    private void considerNotify(ObserverWrapper observer) {
        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;
        }
        if (observer.mLastVersion >= mVersion) {
            return;
        }
        observer.mLastVersion = mVersion;
        //noinspection unchecked
        observer.mObserver.onChanged((T) mData);
    }

dispatchingValue() 裏對觀察者集合 mObservers 進行遍歷,執行 considerNotify 方法。consider 這單詞用得好啊,考慮要不要通知。

considerNotify 方法裏,會修改 LifecycleBoundObserver 的活躍狀態,判斷當前 LifecycleBoundObserver 的版本號。

最終調用到 Observer.onChanged(T) 方法。也就是我們使用 LiveData 一開始傳進來的回調函數。

 

這就是 LiveData 實現數據更新就回調,並且關聯生命週期的基本流程。

除此之外,還有不關聯生命週期的 observeForever 方法。

LiveData.java
------------------------------
    @MainThread
    public void observeForever(@NonNull Observer<? super T> observer) {
        assertMainThread("observeForever");
        AlwaysActiveObserver wrapper = new AlwaysActiveObserver(observer);
        ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);
        if (existing != null && existing instanceof LiveData.LifecycleBoundObserver) {
            throw new IllegalArgumentException("Cannot add the same observer"
                    + " with different lifecycles");
        }
        if (existing != null) {
            return;
        }
        wrapper.activeStateChanged(true);
    }

    private class AlwaysActiveObserver extends ObserverWrapper {

        AlwaysActiveObserver(Observer<? super T> observer) {
            super(observer);
        }

        @Override
        boolean shouldBeActive() {
            return true;
        }
    }

MutableLiveData 繼承自 LiveData,把setValue(T) 和 getValue(T) 方法public公開了。

最終使用 LiveData 修改數據,就像這樣使用 setValue 就可以。

 

 

LiveData 推出來是爲了實現谷歌的 DataBinding,實現 MVVM 架構。

然而後面一些第三方庫也開始使用這個強大的 LiveData 工具了。

比如說 LiveEventBus 。

https://github.com/JeremyLiao/LiveEventBus

LiveEventBus

先簡單看看 LiveEventBus 是怎麼使用 LiveData 的。

public final class LiveEventBus {

    public synchronized <T> Observable<T> with(String key, Class<T> type) {
        if (!bus.containsKey(key)) {
            bus.put(key, new LiveEvent<>(key));
        }
        return (Observable<T>) bus.get(key);
    }

    private class LiveEvent<T> implements Observable<T> {

        private final LifecycleLiveData<T> liveData;

        LiveEvent(@NonNull String key) {
            this.key = key;
            this.liveData = new LifecycleLiveData<>();
        }

        @Override
        public void observe(@NonNull final LifecycleOwner owner, @NonNull final Observer<T> observer) {
            if (ThreadUtils.isMainThread()) {
                observeInternal(owner, observer);
            } else {
                mainHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        observeInternal(owner, observer);
                    }
                });
            }
        }

        @MainThread
        private void observeInternal(@NonNull LifecycleOwner owner, @NonNull Observer<T> observer) {
            ObserverWrapper<T> observerWrapper = new ObserverWrapper<>(observer);
            observerWrapper.preventNextEvent = liveData.getVersion() > ExternalLiveData.START_VERSION;
            liveData.observe(owner, observerWrapper);
        }

        @Override
        public void post(T value) {
            if (ThreadUtils.isMainThread()) {
                postInternal(value);
            } else {
                mainHandler.post(new PostValueTask(value));
            }
        }

        @MainThread
        private void postInternal(T value) {
            liveData.setValue(value);
        }

可以看到 LiveEventBus 那一行代碼調用的 observe 方法,最終會使用到 LiveEvent 裏面的 liveData 屬性,讓 liveData 屬性調用 observe(LifecycleOwner, Observer<? super T>) 方法。

而 LiveEventBus 的發送事件,也是調用了 LiveData.setValue(T)。

 

LiveEventBus 它聲稱具有「生命週期感知,消息隨時訂閱,自動取消訂閱」能力,那麼怎麼實現的呢?

我們前面講到,如果生命週期發生變化,LifecycleOwner 會發出事件通知,在 GenericLifecycleObserver.onStateChanged(LifecycleOwner, Lifecycle.Event) 中能接受到回調。

LiveData.java
------------------------------
public abstract class LiveData<T> {

    class LifecycleBoundObserver extends ObserverWrapper implements GenericLifecycleObserver {
        @NonNull
        final LifecycleOwner mOwner;

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


    @MainThread
    public void removeObserver(@NonNull final Observer<? super T> observer) {
        assertMainThread("removeObserver");
        ObserverWrapper removed = mObservers.remove(observer);
        if (removed == null) {
            return;
        }
        removed.detachObserver();
        removed.activeStateChanged(false);
    }



LiveEventBus.java
------------------------------
public final class LiveEventBus {

    private class LiveEvent<T> implements Observable<T> {

        private class LifecycleLiveData<T> extends ExternalLiveData<T> {
            @Override
            protected Lifecycle.State observerActiveLevel() {
                return lifecycleObserverAlwaysActive ? Lifecycle.State.CREATED : Lifecycle.State.STARTED;
            }

            @Override
            public void removeObserver(@NonNull Observer<? super T> observer) {
                super.removeObserver(observer);
                if (autoClear && !liveData.hasObservers()) {
                    LiveEventBus.get().bus.remove(key);
                }
            }
        }

前面講過在 LiveData 的內部類 LifecycleBoundObserver.onStateChanged 方法中會判斷如果當前 state 是 DESTROYED,就刪除觀察者操作。這個要刪除的觀察者 Observer 是 LiveData 的所包裹的數據的觀察者。

具體在 LiveData 代碼的邏輯是,把這個observer 從 mObservers集合(LiveData 所緩存的一份觀察者列表) 中移除。

 

對應到我們 LiveEventBus ,就是我們使用 LiveEventBus 傳進去的 Observer 回調函數給移除了。

這樣就實現了「自動取消訂閱」的效果。


 

還有LiveEventBus聲稱具有「整個生命週期(從onCreate到onDestroy)都可以實時收到消息」能力,那麼怎麼實現的呢?

ps:這算值得寫出來的能力嗎?這不是一個正常的事件總線應有的能力嗎?

ExternalLiveData.java
------------------------------
public class ExternalLiveData<T> extends MutableLiveData<T> {

    protected Lifecycle.State observerActiveLevel() {
        return CREATED;
    }

    class ExternalLifecycleBoundObserver extends LifecycleBoundObserver {

        ExternalLifecycleBoundObserver(@NonNull LifecycleOwner owner, Observer<? super T> observer) {
            super(owner, observer);
        }

        @Override
        boolean shouldBeActive() {
            return mOwner.getLifecycle().getCurrentState().isAtLeast(observerActiveLevel());
        }
    }



LiveEventBus.java
------------------------------
public final class LiveEventBus {

    private boolean lifecycleObserverAlwaysActive = true;

    private class LifecycleLiveData<T> extends ExternalLiveData<T> {
        @Override
        protected Lifecycle.State observerActiveLevel() {
            return lifecycleObserverAlwaysActive ? Lifecycle.State.CREATED : Lifecycle.State.STARTED;
        }



LiveData.java
------------------------------
public abstract class LiveData<T> {


    class LifecycleBoundObserver extends ObserverWrapper implements GenericLifecycleObserver {

        @Override
        boolean shouldBeActive() {
            return mOwner.getLifecycle().getCurrentState().isAtLeast(STARTED);
        }

原生 LiveData.java 使用了 LifecycleBoundObserver,所以在判定是否活躍的這個 shouldBeActive() 方法中,owner 的生命週期 state ≥ STARTED 纔會認爲是活躍。即 STARTED 和 RESUMED。符合 MVVM 的特性,可見的界面纔有必要更新UI。

LiveEventBus 如果使用這個策略是不太合理的,所以重寫了 shouldBeActive() 方法,讓它判斷邏輯是≥CREATED(LiveEventBus的默認情況)即認爲是活躍。達到了官網宣稱的「整個生命週期(從onCreate到onDestroy)都可以實時收到消息」效果。

 

 

參考來源:

https://developer.android.com/topic/libraries/architecture/lifecycle

https://developer.android.com/topic/libraries/architecture/livedata

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章