Rx java 订阅热可观测数据,无需完成
我无法使用正确的语法来执行以下操作:Rx java 订阅热可观测数据,无需完成,rx-java,rx-java2,Rx Java,Rx Java2,我无法使用正确的语法来执行以下操作: 创建一个只执行一次且从不调用onComplete的热可观察对象 让不同的可观测对象收听并响应热可观测对象发出的数据,而不强迫热可观测对象调用onComplete 下面是一个简化的例子: // Create an observable that never calls onComplete and keeps spitting out data Observable<Foo> hotObservable = Observable.create(em
// Create an observable that never calls onComplete and keeps spitting out data
Observable<Foo> hotObservable = Observable.create(emitter -> {
while (true) {
Foo someData = listenToInputStream();
emitter.onNext(someData);
}
}
// Ensure observable is fired off immediately
ConnectableObservable cObs = hotObservable
.subscribeOn(Schedulers.io())
.publish();
cObs.connect();
Single<Foo> obs1 = cObs
.subscribeOn(Schedulers.io())
.doOnSubscribe(x -> triggerObs1EventToBeSentToInputStream)
.filter(someFilter)
.singleOrError();
obs1.subscribe(someConsumer);
Single<Bar> obs2 = cObs
.subscribeOn(Schedulers.io())
.doOnSubscribe(x -> triggerObs2EventToBeSentToInputStream)
.filter(someOtherFilter)
.map(fooToBar)
.singleOrError();
obs2.subscribe(someOtherConsumer);
//创建一个从不调用onComplete并不断吐出数据的可观察对象
可观测的热可观测=可观测的。创建(发射器->{
while(true){
Foo someData=listenToInputStream();
emitter.onNext(someData);
}
}
//确保observable立即启动
可连接可观察cObs=热可观察
.subscribeOn(Schedulers.io())
.publish();
cObs.connect();
单obs1=cObs
.subscribeOn(Schedulers.io())
.doOnSubscribe(x->TriggerObs1EventToBeentToInputStream)
.filter(someFilter)
.singleOrError();
obs1.订阅(someConsumer);
单obs2=cObs
.subscribeOn(Schedulers.io())
.doOnSubscribe(x->TriggerObs2EventToBeentToInputStream)
.filter(someOtherFilter)
.地图(fooToBar)
.singleOrError();
obs2.订阅(其他消费者);
我看到firstOrError()可以工作,但singleOrError()/lastOrError()/.takeLast(1)不能。有没有一种方法可以在不阻塞/挂起的情况下获取与筛选条件匹配的最新版本
FWIW,如果我使用.take(1).singleOrError()它会通过,但我假设它与firstOrError()相同。我正在查找与该过滤器匹配的最新发出的数据
我还有其他的观测者,他们可以监听热可观测对象发出的任何数量/类型的数据,因此我为这些特定的观测者调用doOnSubscribe,而不是将输入流直接集成到观测者本身。根据天网的主题思想,我认为如果我使用PublishSubject,它会起到一定的作用作为一个中间人。目前它的工作方式有点像take(),但我想我可以扩展到更灵活的方式,返回1到N个项目 例如:
PublishSubject<Foo> pSubj = PublishSubject.create();
cObjs
.filter(getCorrectData)
.doOnSubscribe(x -> triggerEventToBeSentToInputStream)
.subscribe(x -> {
pSubj.onNext(x);
pSubj.complete();
});
Single<Foo> obs1 = pSubj
.subscribeOn(Schedulers.io())
//etc
PublishSubject pSubj=PublishSubject.create();
眼镜蛇
.filter(getCorrectData)
.doOnSubscribe(x->TriggerEventToBeentToInputStream)
.订阅(x->{
pSubj.onNext(x);
pSubj.complete();
});
单obs1=pSubj
.subscribeOn(Schedulers.io())
//等
根据Skynets的主题思想,我认为如果我使用PublishSubject作为中间人,它会有点效果。目前它的工作方式有点像take(),但我想我可以扩展到更灵活,返回1到N个项目
例如:
PublishSubject<Foo> pSubj = PublishSubject.create();
cObjs
.filter(getCorrectData)
.doOnSubscribe(x -> triggerEventToBeSentToInputStream)
.subscribe(x -> {
pSubj.onNext(x);
pSubj.complete();
});
Single<Foo> obs1 = pSubj
.subscribeOn(Schedulers.io())
//etc
PublishSubject pSubj=PublishSubject.create();
眼镜蛇
.filter(getCorrectData)
.doOnSubscribe(x->TriggerEventToBeentToInputStream)
.订阅(x->{
pSubj.onNext(x);
pSubj.complete();
});
单obs1=pSubj
.subscribeOn(Schedulers.io())
//等
您确定要使用单次
?听起来您对多个事件感兴趣,单次
发出一个事件(成功或错误),并且该事件是终端。while(true)在任何代码库中,都应该发出警报!您是否检查过RX Subject是否是一个好的替代品?冷可观察物通常来自Observable。create()是的,我相信我想要一个。数据输入流返回一个与传入请求相关的项(由doOnSubscribe的内容调用)。while(true)这只是一个简单的例子,让我们明白这应该一直运行。即使它是一个Observable.create,它也是一个与数据输入流的连接,因此很热。如果我真的可以观察到,使用它会关闭连接,这不是我想要的。你确定要使用Single
?听起来像是你e对多个事件感兴趣,Single
发出一个事件(成功或错误),该事件是终端事件。而任何代码库中的(true)都会发出警报!您是否检查过RX主题是否是一个好的替代品?冷观测通常来自Observable。create()是的,我相信我想要一个。数据输入流返回一个与传入请求相关的项(由doOnSubscribe的内容调用)。而(true)作为一个简化的例子,它告诉我们这应该一直运行。尽管它是一个Observable.create,但它是一个到数据输入流的连接,因此很热。如果我使用Observable.using,它会关闭连接,这不是我想要的