日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android Transformations分析

發布時間:2023/12/29 Android 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android Transformations分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Android Transformations分析

  • 前言
  • Map與switchMap
    • Map
      • 首先來看方法參數及返回值:
      • 方法體
    • switchMap
  • MediatorLiveData
  • 總結
        • 還有最重要的一點就是Function方法的執行時機

前言

之前看大佬對于這個類的解析是站在他們的角度分析的,作為初學者剛開始的時候有點看不懂,看過源碼之后來記錄一下心得,這個類的基礎是LiveData,是一個帶有生命周期控制的觀察者模式框架,不清楚的小伙伴可以把它當作一個回調。

Map與switchMap

目前只分析這兩個方法,第三個方法時后加的。

Map

首先來看方法參數及返回值:

  • 運行于主線程的靜態方法
  • 兩個參數,第一個參數為一個LiveData對象,第二個參數為一個function接口,觀察接口可知只有一個方法apply,對象泛型的第一個參數類型為方法的入參類型,第二個參數類型為方法的出參類型。
  • 返回值LiveData的泛型實際類型為Function的apply方法的返回類型一致。
  • @MainThreadpublic static <X, Y> LiveData<Y> map(@NonNull LiveData<X> source,@NonNull final Function<X, Y> mapFunction) public interface Function<I, O> {/*** Applies this function to the given input.** @param input the input* @return the function result.*/O apply(I input); }

    方法體

    方法體很簡單:

  • 創建一個MediatorLiveData對象。
  • 執行該對象的addSource方法,參數為一個LiveData和一個Observer。
  • 將這個對象返回。
  • final MediatorLiveData<Y> result = new MediatorLiveData<>();result.addSource(source, new Observer<X>() {@Overridepublic void onChanged(@Nullable X x) {result.setValue(mapFunction.apply(x));}});return result;

    首先就是這個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對象

    private SafeIterableMap<LiveData<?>, Source<?>> mSources = new SafeIterableMap<>();

    然后通過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分析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。