Android Transformations分析
Android Transformations分析
- 前言
- Map與switchMap
- Map
- 首先來看方法參數及返回值:
- 方法體
- switchMap
- MediatorLiveData
- 總結
- 還有最重要的一點就是Function方法的執行時機
前言
之前看大佬對于這個類的解析是站在他們的角度分析的,作為初學者剛開始的時候有點看不懂,看過源碼之后來記錄一下心得,這個類的基礎是LiveData,是一個帶有生命周期控制的觀察者模式框架,不清楚的小伙伴可以把它當作一個回調。
Map與switchMap
目前只分析這兩個方法,第三個方法時后加的。
Map
首先來看方法參數及返回值:
方法體
方法體很簡單:
首先就是這個Observer,直譯就是觀察者,可以類比普通的回調接口,相當于我們在這里實現了一個回調,那么它必然要在某個地方被注冊才能進行使用。結合方法名為addSource,以及onChange里是result的方法,我們在這里推測是將這個Observer注冊給source對象。
public interface Observer<T> {/*** Called when the data is changed.* @param t The new data*/void onChanged(T t); }那么現在還有一個問題就是MediatorLiveData,可以跳過switchMap去看(這兩個方法差不多)。
switchMap
這個方法和上一個很像,區別就是Function方法的第二個參數變為了指定為LiveData,其他的方面幾乎不變,代表的意義也大差不差。
LiveData<Y> newLiveData = switchMapFunction.apply(x);if (mSource == newLiveData) {return;}if (mSource != null) {result.removeSource(mSource);}mSource = newLiveData;if (mSource != null) {result.addSource(mSource, new Observer<Y>() {@Overridepublic void onChanged(@Nullable Y y) {result.setValue(y);}});}MediatorLiveData
這個類也很簡單,它繼承于MutableLiveData,也就是最終是LiveData,并且從它的類doc注釋中我們很容易了解到這是為了更容易實現多個數據(LiveData)整合所提出的,我們接下來來看上面提到的addSource方法。
它會先創建一個內部類Source,然后執行mSources的putIfAbsent方法。mSources是一個map對象
然后通過existing 判斷當前的Source是否被存儲過,知道現在還沒有驗證我們上面的猜測與問題,Observer在哪里注冊的,其他方法我們就忽略,因為都不可能進行注冊,只有最后的e.plug()最有可能。
@MainThreadpublic <S> void addSource(@NonNull LiveData<S> source, @NonNull Observer<? super S> onChanged) {Source<S> e = new Source<>(source, onChanged);Source<?> existing = mSources.putIfAbsent(source, e);if (existing != null && existing.mObserver != onChanged) {throw new IllegalArgumentException("This source was already added with the different observer");}if (existing != null) {return;}if (hasActiveObservers()) {e.plug();}}果然,它執行了注冊方法,至此我們看完了整個流程
void plug() {mLiveData.observeForever(this);}總結
其實就是把一個LiveData轉化為另一個LiveData使用,可以類比為回調異步鏈的調用,source的LiveDta執行onchange的時候,result的LiveData執行setValue方法。另外,使用MediatorLiveData只是單純的使用他的方法,并沒有使用它最主要的合并數據的特性(這也是我一直迷的點,我之前一直在找外部是怎么利用數據整合的)。
還有最重要的一點就是Function方法的執行時機
經過分析之后應該都可以明白了,類比回調,他也是會在source執行onChange方法的時候才會最終執行。
總結
以上是生活随笔為你收集整理的Android Transformations分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言程序设计培训课件打包,C语言程序设
- 下一篇: Unity 射线碰撞检测