リセットしたいBehaviorSubject
があります。つまり、作成したばかりのように、最新の値を使用できないようにしたいということです。
これを行うためのAPIが表示されないようですが、同じ結果を達成する別の方法があると思いますか?
私が望んでいるのは、イベントを発行する必要があることです。特定のマネージャーが「開始済み」状態の場合、購読者は購読時に最新のイベントを取得したいと思います。しかし、このマネージャーが「停止」している場合、最新のイベントは使用できません(最初に開始されなかった場合と同様)。
BehaviorSubject
をクリアすることを前提としています(それ以外ではonComplete
を呼び出さないため)。これはサポートされていませんが、消費者が無視する現在の値を設定することで同様の効果を達成できます。
public static final Object EMPTY = new Object();
BehaviorSubject<Object> subject = BehaviorSubject.createDefault(EMPTY);
Observable<YourType> obs = subject.filter(v -> v != EMPTY).cast(YourType.class);
obs.subscribe(System.out::println);
// send normal data
subject.onNext(1);
subject.onNext(2);
// clear the subject
subject.onNext(EMPTY);
// this should not print anything
obs.subscribe(System.out::println);
オブザーバブルの値をオンまたはオフに切り替えるもう1つの方法は、switchMap()
を使用して、実際のオブザーバブルと空のオブザーバブルを切り替えることです。
マネージャーオブジェクトがあり、その状態を示すオブザーバブルがあるとします。その後、
subjectObservable = manager.getStateObservable()
.switchMap( state -> state == ON ? subject : Observable.never() );
manager
がON
状態にある間だけ値を出力します。
@akarnokdの答えの問題は、.castがYourTypeがインターフェースまたはList<String>
などの汎用タイプになることを妨げることです。
別のオプションは、オンとオフを切り替えることができるブール値フィールドでフィルタリングすることです。
private BehaviorSubject<PandoraApp> subject = BehaviorSubject.create();
private boolean enabled = true;
Observable<PandoraApp> observable = subject.filter(v -> enabled);
メソッドが異なるスレッドで呼び出されている場合、フィルターフラグにAtomicBooleanを使用できます。
私はいくつかの場合により良い解決策を見つけます:subject.skiplast(1)BehaviorSubjectの「振る舞い」のために保持されているストリームの最後の位置を「きれいにする」ために働くことができます
これは私のライブラリです:
implementation "com.github.kolyall:rxjava2-empty:1.0.36"
例:
private val myBehaviorSubject = BehaviorSubjectOptional.createOptional<MyItem?>()
errorBehaviorSubject.toObservable()
.subscribe{ item-> Log.d("onNext1", "item = $item")}
var item:MyItem? = MyItem()
myBehaviorSubject.onNextOptional(item)
//For reset:
myBehaviorSubject.clear()
//OR
item = null
myBehaviorSubject.onNextOptional(item)
errorBehaviorSubject.toObservable()
.subscribe{ item-> Log.d("onNext2", "item = $item")}
次のようにsetTimeoutを使用します。
setOtpoint(value) {
this._setOption.next(value);
// Clear BehaviorSubject after emit value
setTimeout(() => {
this._setOption.next(null);
}, 100);
}