我有一個BehaviorSubject
,我想重置 - 我的意思是我希望最新的值不可用,就像它剛剛創建。如何重置行爲主題
我似乎沒有看到一個API來做到這一點,但我想有另一種方法來實現相同的結果?
我希望的行爲是我需要發出事件,並且我希望訂閱者在訂閱時獲取最新的事件 - 如果特定的經理處於「已啓動」狀態。但是,當這位經理「停止」時,最新的活動應該不可用(就像從未開始的那樣)。
我有一個BehaviorSubject
,我想重置 - 我的意思是我希望最新的值不可用,就像它剛剛創建。如何重置行爲主題
我似乎沒有看到一個API來做到這一點,但我想有另一種方法來實現相同的結果?
我希望的行爲是我需要發出事件,並且我希望訂閱者在訂閱時獲取最新的事件 - 如果特定的經理處於「已啓動」狀態。但是,當這位經理「停止」時,最新的活動應該不可用(就像從未開始的那樣)。
我假設你想清除BehaviorSubject
(因爲否則不要調用onComplete
就可以了)。不支持,但你可以通過具有被消費者忽略的電流值達到類似的效果:
public static final Object EMPTY = new Object();
BehaviorSubject<Object> subject = BehaviorSubject.createDefault(EMPTY);
Observable<YourType> obs = subject.filter(v -> v != EMTPY).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);
非常感謝!這就是訣竅。 – BoD
開關可觀察到的上的價值和關閉的另一種方法是使用switchMap()
實際之間翻轉可觀察的和空的。
讓我們假設你有一個管理器對象,並且它有一個顯示其狀態的可觀察對象。然後,當manager
處於ON
狀態
subjectObservable = manager.getStateObservable()
.switchMap(state -> state == ON ? subject : Observable.never());
將僅發射值。
有趣!謝謝。 – BoD
我找出某些情況下,更好更好的解決方案是:subject.skiplast(1)它可以工作到「潔淨」流的最後一個位置正在被保留,因爲的BehaviorSubject「行爲」
隨着一個BehaviorSubject有一個剛剛創建時的下一個值,這就是它的全部要點(以及爲什麼在創建時需要提供該值)。 – jonrsharpe
@jonrsharpe但是當你創建它時你不需要提供它! http://reactivex.io/RxJava/2.x/javadoc/io/reactivex/subjects/BehaviorSubject.html#create-- – BoD
奇怪的是,它並沒有在RxJS版本中(https://github.com) /Reactive-Extensions/RxJS/blob/master/doc/api/subjects/behaviorsubject.md) - 如果你不想提供初始值,爲什麼不用'ReplaySubject'代替? – jonrsharpe