如何重置BehaviorSubject

BoD*_*BoD 18 stream reactive-programming rx-java rx-java2

我有一个BehaviorSubject我想要重置 - 我的意思是我希望最新值不可用,就像它刚刚创建一样.

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

我希望的行为是我需要发出事件,并且我希望订阅者在他们订阅时获得最新事件 - 如果特定经理处于"已启动"状态.但是当这个经理被"停止"时,最新的事件应该不可用(就像它从未在第一时间开始一样).

aka*_*okd 21

我假设您要清除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);
Run Code Online (Sandbox Code Playgroud)


Bob*_*ish 9

另一种切换可观察值的开关方法是用于switchMap()在实际可观察​​值和空值之间进行切换.

假设你有一个管理器对象,它有一个显示其状态的observable.然后,

subjectObservable = manager.getStateObservable()
  .switchMap( state -> state == ON ? subject : Observable.never() );
Run Code Online (Sandbox Code Playgroud)

只会manager在处于ON状态时发出值.