LiveData源碼分析

一、LiveData簡(jiǎn)介
LiveData是google官方架構(gòu)JetPack系列的一個(gè)響應(yīng)式開(kāi)發(fā)框架,LiveData是一個(gè)可以被觀察的數(shù)據(jù)持有者類(lèi)。說(shuō)到響應(yīng)式開(kāi)發(fā)或者說(shuō)觀察者就不免想到RxJava,RxJava將觀察者模式運(yùn)用的爐火純青。但LiveData和RxJava的定位是不一樣的,LiveData主要用于搭建MVVM架構(gòu),并在其中作為數(shù)據(jù)持有者,LiveData能監(jiān)聽(tīng)組件的生命周期變化,這樣一來(lái)只會(huì)更新處于活躍狀態(tài)的組件。
LiveData的特點(diǎn):1)采用觀察者模式自動(dòng)提示UI更新。2)不需要手動(dòng)處理生命周期,不會(huì)因?yàn)锳ctivity的銷(xiāo)毀重建而丟失數(shù)據(jù)。3)不會(huì)出現(xiàn)內(nèi)存泄漏。4)不需要手動(dòng)取消訂閱,Activity在非活躍狀態(tài)下(銷(xiāo)毀、finish之后)不會(huì)收到數(shù)據(jù)更新信息。

二、LiveData用法
1)LiveData往往結(jié)合于ViewModel使用,對(duì)于ViewModel的分析之前已經(jīng)進(jìn)行分析了,這里不再過(guò)多描述。首先在ViewModel中創(chuàng)建LiveData,代碼如下:

class MainViewModel : ViewModel() {

private val repertory: MainRepositoryby lazy { MainRepository()}

    var data: MutableLiveData = MutableLiveData()

fun getDataFromServer(){

repertory.getDataFromServer(data)

}
}

這里采用的是MutableLiveData,它是LiveData的實(shí)現(xiàn)類(lèi),LiveData是一個(gè)抽象類(lèi)。
2)在Activity中觀察LiveData的數(shù)據(jù)變化。代碼如下:

class MainActivity : AppCompatActivity() {
 private lateinit var mModel: MainViewModel
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        initData()
    }
    private fun initData() {
        mModel = ViewModelProviders.of(this)[MainViewModel::class.java]
        mModel.data?.observe(this, Observer {
            val mainAdapter = MainAdapter(this, it)
            val linearLayoutManager = LinearLayoutManager(this)
            rv.layoutManager = linearLayoutManager
            rv.adapter = mainAdapter
        })
        mModel.getDataFromServer()
    }
}

3)對(duì)LiveData進(jìn)行賦值,代碼如下:

fun postData() {
        mModel.data.postValue(JsonBean(ArrayList(), 0, ""))
    }

三、源碼分析
1)首先先從實(shí)例化MutableLiveData入手,MutableLiveData是LiveData的實(shí)現(xiàn)類(lèi),源碼如下:

public class MutableLiveData<T> extends LiveData<T> {
    @Override
    public void postValue(T value) {
        super.postValue(value);
    }
    @Override
    public void setValue(T value) {
        super.setValue(value);
    }
}

從代碼中可以看到,LiveData是一個(gè)泛型類(lèi),泛型參數(shù)就是存儲(chǔ)數(shù)據(jù)的實(shí)際類(lèi)型,同時(shí)MutableLiveData提供兩個(gè)賦值方法:postValue和setValue,而這兩個(gè)方法直接調(diào)用父類(lèi)中的方法。所以看一下父類(lèi)中這兩個(gè)方法的具體實(shí)現(xiàn)

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

setValue方法必須在主線程調(diào)用,調(diào)用只有LiveData就持有新的數(shù)據(jù)了。

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

postValue方法同樣是更新LiveData持有的數(shù)據(jù),但區(qū)別在于postValue方法是單獨(dú)采用Runnable通過(guò)主線程handler發(fā)送給主線程更新數(shù)據(jù),這樣一來(lái)postValue就可以在異線程更新數(shù)據(jù)了。其實(shí)postValue最終更新數(shù)據(jù)還是走的setValue方法。
2)分析在Activity中訂閱LiveData的方法observe,此方法接收兩個(gè)參數(shù),一個(gè)LifecycleOwner和Observer<T>,代碼如下:

@MainThread
    public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<T> observer) {
        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);
    }

從中我們可以發(fā)現(xiàn)方法首先會(huì)判斷當(dāng)前視圖狀態(tài)是否已經(jīng)是”DESTROYED“狀態(tài),在分析訂閱方法之前先分析一下LifecycleOwner這個(gè)接口。

public interface LifecycleOwner {
    /**
     * Returns the Lifecycle of the provider.
     *
     * @return The lifecycle of the provider.
     */
    @NonNull
    Lifecycle getLifecycle();
}

在這個(gè)接口中只有一個(gè)方法用于返回Lifecycle。查看一下接口的實(shí)現(xiàn)類(lèi)可以發(fā)現(xiàn)v4和v7包下的Acvitity和Fragment都實(shí)現(xiàn)了這個(gè)接口。接下來(lái)看一下Lifecycle這個(gè)抽象類(lèi)。

public abstract class Lifecycle {
    @MainThread
    public abstract void addObserver(@NonNull LifecycleObserver observer);
    @MainThread
    public abstract void removeObserver(@NonNull LifecycleObserver observer);
    @MainThread
    @NonNull
    public abstract State getCurrentState();
.....省略部分代碼
}

類(lèi)中定義了添加和移除訂閱者的方法,同時(shí)還包括訂閱者的生命周期狀態(tài)信息。而Lifecycle的唯一實(shí)現(xiàn)類(lèi)是LifecycleRegistry,代碼如下。

public class LifecycleRegistry extends Lifecycle {
    private FastSafeIterableMap<LifecycleObserver, ObserverWithState> mObserverMap = new FastSafeIterableMap<>();
  
    private final WeakReference<LifecycleOwner> mLifecycleOwner;
    private int mAddingObserverCounter = 0;

    private boolean mHandlingEvent = false;
    private boolean mNewEventOccurred = false;
    private ArrayList<State> mParentStates = new ArrayList<>();
    public LifecycleRegistry(@NonNull LifecycleOwner provider) {
        mLifecycleOwner = new WeakReference<>(provider);
        mState = INITIALIZED;
    }
......省略部分代碼

    private boolean isSynced() {
        if (mObserverMap.size() == 0) {
            return true;
        }
        State eldestObserverState = mObserverMap.eldest().getValue().mState;
        State newestObserverState = mObserverMap.newest().getValue().mState;
        return eldestObserverState == newestObserverState && mState == newestObserverState;
    }

    private State calculateTargetState(LifecycleObserver observer) {
        Entry<LifecycleObserver, ObserverWithState> previous = mObserverMap.ceil(observer);

        State siblingState = previous != null ? previous.getValue().mState : null;
        State parentState = !mParentStates.isEmpty() ? mParentStates.get(mParentStates.size() - 1)
                : null;
        return min(min(mState, siblingState), parentState);
    }

    @Override
    public void addObserver(@NonNull LifecycleObserver observer) {
        State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;
        ObserverWithState statefulObserver = new ObserverWithState(observer, initialState);
        ObserverWithState previous = mObserverMap.putIfAbsent(observer, statefulObserver);

        if (previous != null) {
            return;
        }
        LifecycleOwner lifecycleOwner = mLifecycleOwner.get();
        if (lifecycleOwner == null) {
            // it is null we should be destroyed. Fallback quickly
            return;
        }

        boolean isReentrance = mAddingObserverCounter != 0 || mHandlingEvent;
        State targetState = calculateTargetState(observer);
        mAddingObserverCounter++;
        while ((statefulObserver.mState.compareTo(targetState) < 0
                && mObserverMap.contains(observer))) {
            pushParentState(statefulObserver.mState);
            statefulObserver.dispatchEvent(lifecycleOwner, upEvent(statefulObserver.mState));
            popParentState();
            // mState / subling may have been changed recalculate
            targetState = calculateTargetState(observer);
        }

        if (!isReentrance) {
            // we do sync only on the top level.
            sync();
        }
        mAddingObserverCounter--;
    }

    private void popParentState() {
        mParentStates.remove(mParentStates.size() - 1);
    }

    private void pushParentState(State state) {
        mParentStates.add(state);
    }

    @Override
    public void removeObserver(@NonNull LifecycleObserver observer) {
        mObserverMap.remove(observer);
    }
    @NonNull
    @Override
    public State getCurrentState() {
        return mState;
    }

    static State getStateAfter(Event event) {
        switch (event) {
            case ON_CREATE:
            case ON_STOP:
                return CREATED;
            case ON_START:
            case ON_PAUSE:
                return STARTED;
            case ON_RESUME:
                return RESUMED;
            case ON_DESTROY:
                return DESTROYED;
            case ON_ANY:
                break;
        }
        throw new IllegalArgumentException("Unexpected event value " + event);
    }

    private static Event downEvent(State state) {
        switch (state) {
            case INITIALIZED:
                throw new IllegalArgumentException();
            case CREATED:
                return ON_DESTROY;
            case STARTED:
                return ON_STOP;
            case RESUMED:
                return ON_PAUSE;
            case DESTROYED:
                throw new IllegalArgumentException();
        }
        throw new IllegalArgumentException("Unexpected state value " + state);
    }

    private static Event upEvent(State state) {
        switch (state) {
            case INITIALIZED:
            case DESTROYED:
                return ON_CREATE;
            case CREATED:
                return ON_START;
            case STARTED:
                return ON_RESUME;
            case RESUMED:
                throw new IllegalArgumentException();
        }
        throw new IllegalArgumentException("Unexpected state value " + state);
    }
.....省略部分代碼
}

先來(lái)看一下主要的成員變量mObserverMap和mLifecycleOwner,mObserverMap是一個(gè)Map結(jié)構(gòu),以觀察者為key存儲(chǔ)觀察者狀態(tài)。mLifecycleOwner是一個(gè)弱引用,持有LifecycleOwner,其實(shí)LifecyleOwner就是Activity或者Fragment。前面說(shuō)到過(guò)Activity中會(huì)實(shí)現(xiàn)LifecycleOwner接口,其實(shí)追蹤到源碼發(fā)現(xiàn)SupportActivity實(shí)現(xiàn)了LifecycleOwner接口,同時(shí)聲明變量LifecycleRegistry,代碼如下:

 private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);

由此一來(lái)LifecycleRegistry就持有Activity的弱引用了,這樣一來(lái)既能監(jiān)聽(tīng)Activity的生命周期同時(shí)也不會(huì)造成內(nèi)存泄漏。接下來(lái)看關(guān)鍵的訂閱和取消訂閱方法,取消訂閱很簡(jiǎn)單就是將觀察者移除Map集合,訂閱方法會(huì)先校驗(yàn)觀察者的生命周期狀態(tài),同時(shí)從軟引用中獲取LifecycleOwner,如果為空的話則說(shuō)明界面已經(jīng)被銷(xiāo)毀了,則不需要進(jìn)行訂閱了。否則進(jìn)行訂閱操作。
現(xiàn)在回到前面繼續(xù)分析LiveData的訂閱操作,訂閱操作會(huì)將owner和observer統(tǒng)一包裝成LifecycleBoundObserver,這是Lifecycle真正的訂閱者。

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

        LifecycleBoundObserver(@NonNull LifecycleOwner owner, Observer<T> observer) {
            super(observer);
            mOwner = owner;
        }

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

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

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

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

類(lèi)中封裝了對(duì)于Lifecycle的狀態(tài)賦值操作和狀態(tài)改變對(duì)觀察者進(jìn)行取消訂閱操作。最后將LifecycleBoundObserver傳入LifecycleRegistry完成訂閱。整體的訂閱流程就分析完了。
3)Observer響應(yīng)獲取數(shù)據(jù)變化流程分析。
分析完訂閱流程接下來(lái)分析LiveData如何響應(yīng)數(shù)據(jù)變化通知給訂閱者,這里需要從setValue方法入手。

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

 private 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<T>, ObserverWrapper>> iterator =
                        mObservers.iteratorWithAdditions(); iterator.hasNext(); ) {
                    considerNotify(iterator.next().getValue());
                    if (mDispatchInvalidated) {
                        break;
                    }
                }
            }
        } while (mDispatchInvalidated);
        mDispatchingValue = false;
    }

調(diào)用setValue方法后會(huì)調(diào)用dispatchingValue方法循環(huán)通知訂閱者響應(yīng)數(shù)據(jù)變化。

三、LiveData特點(diǎn)原理總結(jié)
1)采用觀察者模式自動(dòng)提示UI更新:
由于采用訂閱方式獲取數(shù)據(jù)變化所以自動(dòng)獲取數(shù)據(jù)更新。
2)不需要手動(dòng)處理生命周期,不會(huì)因?yàn)锳ctivity的銷(xiāo)毀重建而丟失數(shù)據(jù):
會(huì)自動(dòng)重新訂閱。
3)不會(huì)出現(xiàn)內(nèi)存泄漏:
Lifecycle持有的是Activity(Fragment)的弱引用。
4)不需要手動(dòng)取消訂閱,Activity在非活躍狀態(tài)下(銷(xiāo)毀、finish之后)不會(huì)收到數(shù)據(jù)更新信息:
LifecycleRegistry會(huì)回調(diào)Activity的狀態(tài),在onDestory之后LiveData自動(dòng)取消訂閱。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容