如何重置行为主题
我有一个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