序文
LiveDataはよく使用されますが、ページにオブザーバーを登録し、ViewModelでsetValueとpostValueを呼び出すだけです。今日、LiveDataライブラリを調べて、一般的には使用されていないものをいくつか見つけました。使える。
LiveDataコアライブラリには、 lifecycle-livedataとlifecycle-livedata-coreの2つがあります。
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);
}
}
复制代码