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,刷新后接收值