如何重置行为主题

问题描述:

我有一个BehaviorSubject,我想重置 - 我的意思是我希望最新的值不可用,就像它刚刚创建。如何重置行为主题

我似乎没有看到一个API来做到这一点,但我想有另一种方法来实现相同的结果?

我希望的行为是我需要发出事件,并且我希望订阅者在订阅时获取最新的事件 - 如果特定的经理处于“已启动”状态。但是,当这位经理“停止”时,最新的活动应该不可用(就像从未开始的那样)。

+0

随着一个BehaviorSubject有一个刚刚创建时的下一个值,这就是它的全部要点(以及为什么在创建时需要提供该值)。 – jonrsharpe

+0

@jonrsharpe但是当你创建它时你不需要提供它! http://reactivex.io/RxJava/2.x/javadoc/io/reactivex/subjects/BehaviorSubject.html#create-- – BoD

+0

奇怪的是,它并没有在RxJS版本中(https://github.com) /Reactive-Extensions/RxJS/blob/master/doc/api/subjects/behaviorsubject.md) - 如果你不想提供初始值,为什么不用'ReplaySubject'代替? – jonrsharpe

我假设你想清除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); 
+0

非常感谢!这就是诀窍。 – BoD

开关可观察到的上的价值和关闭的另一种方法是使用switchMap()实际之间翻转可观察的和空的。

让我们假设你有一个管理器对象,并且它有一个显示其状态的可观察对象。然后,当manager处于ON状态

subjectObservable = manager.getStateObservable() 
    .switchMap(state -> state == ON ? subject : Observable.never()); 

将仅发射值。

+0

有趣!谢谢。 – BoD

我找出某些情况下,更好更好的解决方案是:subject.skiplast(1)它可以工作到“洁净”流的最后一个位置正在被保留,因为的BehaviorSubject“行为”