如何重置BehaviorSubject

时间:2017-08-30 12:12:43

标签: rx-java2

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

我似乎没有看到API来执行此操作,但我认为还有另一种方法可以实现相同的结果吗?

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

6 个答案:

答案 0 :(得分:16)

我假设您要清除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); )。这是不受支持的,但你可以通过消费者忽略的当前值来实现类似的效果:

netmiko

答案 1 :(得分:7)

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

假设您有一个管理器对象,它有一个显示其状态的可观察对象。然后,

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

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

答案 2 :(得分:0)

我找到了一个更好的解决方案,对于某些情况是:subject.skiplast(1)它可以工作“清理”由于BehaviorSubject“行为”而保留的流上最后一个位置

答案 3 :(得分:0)

@ akarnokd的回答是:.cast阻止YourType成为接口或通用类型,例如List<String>

另一种选择是过滤一个可以打开和关闭的布尔字段。

    private BehaviorSubject<PandoraApp> subject = BehaviorSubject.create();
    private boolean enabled = true;

    Observable<PandoraApp> observable = subject.filter(v -> enabled);

如果在不同的线程上调用方法,则可以使用AtomicBoolean作为过滤器标志。

答案 4 :(得分:0)

只需像这样使用setTimeout:

<? ?>

答案 5 :(得分:0)

这是我的库:​​

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")}