[ジェットパック]LiveDataの見落とされがちな機能

序文

LiveDataはよく使用されますが、ページにオブザーバーを登録し、ViewModelでsetValueとpostValueを呼び出すだけです。今日、LiveDataライブラリを調べて、一般的には使用されていないものをいくつか見つけました。使える。

LiveDataコアライブラリには、 lifecycle-livedatalifecycle-livedata-coreの2つがあります。

WeChatのスクリーンショット_20220513101852.png

LiveData.java

これはLiveDataのコアクラスであり、すべての主要なロジックはここにあります

このobserveForeverをここで見つけました。このメソッドはめったに使用されません。このメソッドを呼び出して登録されたオブザーバーは常にアクティブな状態になります。ページの一時停止状態と破棄状態は無効であるため、存在しない場合は手動でremoveObserverを呼び出す必要があります。使用する。ページが一時停止状態のときにLiveDataから送信されたデータを受信する必要がある場合は、observeForeverが便利です。

public void observeForever(@NonNull Observer<? super T> observer) {
   ...
}

@MainThread
public void removeObserver(@NonNull final Observer<? super T> observer) {
    ...
}

@MainThread
public void removeObservers(@NonNull final LifecycleOwner owner) {
    ...
    一步移除页面上所有观察者
}
复制代码

MediatorLiveData.java

  • MediatorLiveData.addSource

addSourceを介して複数のLiveDataソースを追加できます。そのうちの1つがデータを放出する限り、MediatorLiveDataはデータをトリガーして転送します。複数のソースを監視する必要がある場合は、MediatorLiveDataを使用して1つの放出ソースに収集できるかどうかを検討できます。

  • MediatorLiveData.removeSource

追加された入力ソースはいつでも削除できます

   LiveData  liveData1 = ...;
   LiveData  liveData2 = ...;
  
   MediatorLiveData  liveDataMerger = new MediatorLiveData<>();
   liveDataMerger.addSource(liveData1, value -> liveDataMerger.setValue(value));
   liveDataMerger.addSource(liveData2, value -> liveDataMerger.setValue(value));
   
@MainThread
public <S> void removeSource(@NonNull LiveData<S> toRemote) {
    Source<?> source = mSources.remove(toRemote);
    if (source != null) {
        source.unplug();
    }
}   
复制代码

Transformations.java

  • Transformations.distinctUntilChanged

個別のUntilChangedによって処理されたLiveDataが、連続して複数回送信される同じ値に遭遇すると、シールドの値と前の送信の繰り返し値を自動的にインターセプトし、防振武器の複製を解除します。

   MutableLiveData source = new MutableLiveData<Integer>()
   MutableLiveData outputSource = Transformations.distinctUntilChanged(source)
复制代码
  • Transformations.map

指定された関数に従って、元のLiveDataの排出値タイプを別のタイプのLiveDataに変換できます。

public static <X, Y> LiveData<Y> map(
        @NonNull LiveData<X> source,
        @NonNull final Function<X, Y> mapFunction) {
    final MediatorLiveData<Y> result = new MediatorLiveData<>();
    result.addSource(source, new Observer<X>() {
        @Override
        public void onChanged(@Nullable X x) {
            result.setValue(mapFunction.apply(x));
        }
    });
    return result;
}
复制代码
  • Transformations.switchMap

この関数のロジックは非常に複雑で、一文で説明する方法が見つかりませんでした。とりあえず、関数のソースコードとこの関数を呼び出す公式の例をここに貼り付けます。誰もが一緒に理解できます。 。

public static <X, Y> LiveData<Y> switchMap(
        @NonNull LiveData<X> source,
        @NonNull final Function<X, LiveData<Y>> switchMapFunction) {
    final MediatorLiveData<Y> result = new MediatorLiveData<>();
    result.addSource(source, new Observer<X>() {
        LiveData<Y> mSource;

        @Override
        public void onChanged(@Nullable X x) {
            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>() {
                    @Override
                    public void onChanged(@Nullable Y y) {
                        result.setValue(y);
                    }
                });
            }
        }
    });
    return result;
}
复制代码
class UserViewModel extends AndroidViewModel {
    MutableLiveData<String> nameQueryLiveData = ...

    LiveData<List<String>> getUsersWithNameLiveData() {
        return Transformations.switchMap(
            nameQueryLiveData,
                name -> myDataSource.getUsersWithNameLiveData(name));
    }

    void setNameQuery(String name) {
        this.nameQueryLiveData.setValue(name);
    }
}
复制代码

おすすめ

転載: juejin.im/post/7097152522069999647