Rx java rxjava2生产者消费者&x27;下游';请求一个';上游';放出一个
我想使用rxjava2实现简单的生产者-消费者模型,当下游请求一个,而上游发出一个时 我知道Rx java rxjava2生产者消费者&x27;下游';请求一个';上游';放出一个,rx-java,rx-android,rx-java2,Rx Java,Rx Android,Rx Java2,我想使用rxjava2实现简单的生产者-消费者模型,当下游请求一个,而上游发出一个时 我知道flatMap或observeOn具有默认缓冲区大小128,因此我将缓冲区大小设置为1,但它也不起作用 Flowable.defer((Callable<Publisher<Integer>>) () -> Flowable.range(1, 5)) .flatMap((Function<Integer, Publisher<Integer
flatMap
或observeOn
具有默认缓冲区大小128,因此我将缓冲区大小设置为1,但它也不起作用
Flowable.defer((Callable<Publisher<Integer>>) () -> Flowable.range(1, 5))
.flatMap((Function<Integer, Publisher<Integer>>) integer -> {
//do something with long time.
System.out.println("flatMap:" + integer);
return Flowable.just(integer);
}, false, 1) //=====> 1
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.computation(), false, 1) //=====> 2
.subscribe(new Subscriber<Integer>() {
@Override
public void onSubscribe(Subscription s) {
//request one
s.request(1);
}
@Override
public void onNext(Integer integer) {
System.out.println("onNext:" + integer);
}
@Override
public void onError(Throwable t) {
}
@Override
public void onComplete() {
}
});
预期输出,因为我只调用了一次s.request(1)
:
flatMap:1
onNext:1
您的观察者只请求一个项目,但
observeOn()
也将缓冲一个项目。flatMap()
操作符本身将订阅连续输入
observeOn()
为其缓冲区请求1项range()
flatMap()
observeOn()
获取一个项作为其缓冲区,然后请求另一个项flatMap()
获取下一项2。这将被发出并传递到observeOn()
bufferonNext()
flatMap()
获取下一项,3如果您需要完美的、锁定的步骤,“请求一”->“处理一”,那么流控制并不是实现这一点的方法。相反,您可能希望引入一个提供反馈循环的可观察对象,以便观察者告诉可观察对象处理下一个循环。谢谢您的详细步骤。我还认为
flowable
无法做到这一点,所以我将尝试您的“反馈循环”方式。
flatMap:1
onNext:1