Stream 如何重置行为主体

Stream 如何重置行为主体,stream,rx-java,reactive-programming,rx-java2,Stream,Rx Java,Reactive Programming,Rx Java2,我有一个BehaviorSubject,我想重置它-我的意思是我希望最新的值不可用,就像它刚刚创建一样 我似乎没有看到API可以做到这一点,但我想还有其他方法可以达到同样的效果 我期望的行为是,我需要发出事件,并且我希望订阅者在订阅时获得最新的事件—如果特定的管理器处于“已启动”状态。但是当此管理器被“停止”时,最新的事件不应该可用(就像它从一开始就没有启动一样)。我假设您想清除行为主题(因为否则不要调用完成它)。这是不受支持的,但您可以通过使用消费者忽略的当前值来实现类似效果: public

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

我似乎没有看到API可以做到这一点,但我想还有其他方法可以达到同样的效果


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

我假设您想清除
行为主题(因为否则不要调用
完成它)。这是不受支持的,但您可以通过使用消费者忽略的当前值来实现类似效果:

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);
公共静态最终对象为空=新对象();
BehaviorSubject subject=BehaviorSubject.createDefault(空);
可观察obs=subject.filter(v->v!=EMPTY.cast(YourType.class);
obs.subscribe(System.out::println);
//发送正常数据
主题.onNext(1);
主题.onNext(2);
//澄清问题
subject.onNext(空);
//这不应该打印任何内容
obs.subscribe(System.out::println);

另一种打开和关闭可观测值的方法是使用
switchMap()
在实际可观测值和空可观测值之间切换

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

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

仅当
管理器
处于
打开
状态时才会发出值。

我为某些情况找到了更好的解决方案,具体如下:

subject.skiplast(1)

它可以清除流中由于
行为子对象
“行为”

而保留的最后一个位置。@akarnokd的答案是.cast阻止了YourType成为接口或泛型类型,如
列表

另一个选项是对布尔字段进行过滤,您可以打开和关闭该字段

private BehaviorSubject subject=BehaviorSubject.create();
私有布尔启用=真;
Observable=subject.filter(v->enabled);

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

只需像这样使用setTimeout:

setOtpoint(value) {

    this._setOption.next(value);

    // Clear BehaviorSubject after emit value

    setTimeout(() => {
      this._setOption.next(null);
    }, 100);

  }

以下是我的库:

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

private val myBehaviorSubject=BehaviorSubjectOptional.createOptional()
errorBehaviorSubject.toObservable()
.subscribe{item->Log.d(“onNext1”,“item=$item”)}
变量项:MyItem?=MyItem()
myBehaviorSubject.onNextOptional(项目)
//对于重置:
myBehaviorSubject.clear()
//或
item=null
myBehaviorSubject.onNextOptional(项目)
errorBehaviorSubject.toObservable()
.subscribe{item->Log.d(“onNext2”,“item=$item”)}

对于BehaviorSubject,在刚创建时有下一个值可用,这就是它的全部意义(以及为什么创建时必须提供该值)。@jonrsharpe但创建时不必提供它!奇怪的是,在RxJS版本()中没有这种功能-如果不想提供初始值,为什么不使用
ReplaySubject
?我觉得BehaviorSubject相当于大小为1的ReplaySubject。但这根本不能回答我的问题:)我想答案是:你不能。但我最初也被一个空洞的行为主体的前提弄糊涂了!有趣!谢谢。您可以添加管理器如何维护stateObservable吗?
stateObservable
由管理器使用其拥有的任何状态信息进行维护。原始问题的状态为
行为主体
,但可以使用任何可观察到的源。我不能使用此解决方案,但它也帮助解决了我的问题:如果您使用像
列表
这样的泛型类,例如,强制转换是不可能的。。。使用混凝土类的空默认对象,并使用
v->进行筛选!v、 等于(空)
并且删除强制转换在这种情况下应该会有所帮助。这将返回一个可观察的(虽然不是主语)我在上面的代码中尝试了它的工作,但在再次登录后_setOption是get blank value,刷新后接收值