Rx java 可观测支撑反拉力
我一直在为我认为是一个相当基本的问题而挣扎 我有一个Rx java 可观测支撑反拉力,rx-java,reactive-programming,rx-java2,backpressure,Rx Java,Reactive Programming,Rx Java2,Backpressure,我一直在为我认为是一个相当基本的问题而挣扎 我有一个Flowable,它从网络中检索一组项目并将其发送出去 Flowable .create(new FlowableOnSubscribe<Item>() { @Override public void subscribe(FlowableEmitter<Item> emitter) throws Exception { Item item = retriev
Flowable
,它从网络中检索一组项目并将其发送出去
Flowable
.create(new FlowableOnSubscribe<Item>() {
@Override
public void subscribe(FlowableEmitter<Item> emitter) throws Exception {
Item item = retrieveNext();
while (item != null) {
emitter.onNext(item);
if (item.isLast) {
break;
}
item = retrieveNext();
}
emitter.onComplete();
}
}, BackpressureStrategy.BUFFER)
.doOnRequest(new LongConsumer() {
@Override
public void accept(long t) throws Exception {
// ...
}
});
可流动
.create(新的FlowableOnSubscribe(){
@凌驾
public void subscribe(FlowableEmitter发射器)引发异常{
Item=retrieveNext();
while(项!=null){
下一个(项目);
if(item.isLast){
打破
}
item=retrieveNext();
}
emitter.onComplete();
}
},背压等级。缓冲器)
.doOnRequest(新LongConsumer(){
@凌驾
public void accept(长t)引发异常{
// ...
}
});
我需要它在每个请求的基础上工作。也就是说,我保留一个订阅
并在必要时调用Subscription.request(n)
关于(“反应性拉动”部分)的文章描述了观察者的视角,并简要提到了这一点
然而,要使[反应性拉动]起作用,可观察到的A和B必须作出反应
对于请求()来说,这种支持不是必需的
可观测
它没有详细说明如何在原则上实现这种支持
是否有一个共同的模式来实现这种可观察的
/可流动的
?我没有找到一个好的例子或参考。我能想到的一个糟糕的选择是,在发射器时,在循环时,在内锁定一个监视器。requested()==0
并从另一个线程解锁doOnRequest()。但这种方法感觉很麻烦
那么,这种“减速”通常是如何实现的呢
谢谢。使用可流动。生成:
Flowable.generate(
() -> generateItemRetriever(),
(Retriever<Item> retriever, Emitter<Item> emitter) -> {
Item item = retriever.retrieveNext();
if(item!=null && !item.isLast()) {
emitter.onNext(item);
} else {
emitter.onComplete();
}
}
)
Flowable.generate(
()->generateItemRetriever(),
(寻回器寻回器,发射器发射器)->{
Item=retriever.retrieveNext();
if(item!=null&&!item.isLast()){
下一个(项目);
}否则{
emitter.onComplete();
}
}
)
生成的可流动将具有背压感知和取消订阅感知。如果您的检索器
具有需要释放的状态,请使用3参数生成
重载
但是,如果您正在进行HTTP调用,我建议您研究改型之类的东西,它与RxJava非常匹配。使用Flowable.generate
:
Flowable.generate(
() -> generateItemRetriever(),
(Retriever<Item> retriever, Emitter<Item> emitter) -> {
Item item = retriever.retrieveNext();
if(item!=null && !item.isLast()) {
emitter.onNext(item);
} else {
emitter.onComplete();
}
}
)
Flowable.generate(
()->generateItemRetriever(),
(寻回器寻回器,发射器发射器)->{
Item=retriever.retrieveNext();
if(item!=null&&!item.isLast()){
下一个(项目);
}否则{
emitter.onComplete();
}
}
)
生成的可流动将具有背压感知和取消订阅感知。如果您的检索器
具有需要释放的状态,请使用3参数生成
重载
但是,如果您正在进行HTTP调用,我建议您研究改型之类的东西,它与RxJava非常吻合。为了澄清,将描述为2.x编写运算符。为了澄清,将描述为2.x编写运算符。