先搜索,找不到好的答案,所以我们去了:)。
尝试将RxJava2应用于我们在工作中使用的现有管道 - 热源和冷源。虽然停止一个热门(用Flowable.create包裹)很简单,但另一个案例看起来比较棘手。 简而言之,我希望能够使源完成和排出管道中已有的项目,然后才能处理掉。 这就是我提出的(takeUntil()和一个结束序列的特殊项目),但关于有更好的方法的问题仍然存在
(Flowables.repeatCallable是https://github.com/akarnokd/RxJava2Extensions的扩展,比我的情况更适合我的情况) buffer / map / reduce就是为了创建某些处理的相似之处:)
final AtomicInteger counter = new AtomicInteger();
AtomicBoolean stop = new AtomicBoolean(false);
Disposable d = Flowables.repeatCallable(() -> {
return stop.get() ? -1 : counter.getAndIncrement();
}
)
.doOnCancel(() -> {
debug("cancelled");
})
.doOnRequest(l ->
debug(Long.toString(l) + " values requested")
)
.takeUntil(val -> val < 0)
.filter(val -> val >= 0)
.buffer(2000, TimeUnit.MILLISECONDS, scheduler, 15, ArrayListSupplier.asCallable(), true)
.map(list -> {
debug("received " + list.size() + " items: " + list);
return list.size();
})
.reduce(0, (sum, item) -> sum + item)
.subscribeOn(scheduler)
.subscribe(i -> debug("Items received: " + i));
然后,在某些时候:
stop.set(true);
while (!d.isDisposed()) {
// wait
}
这在收到停止信号后完成,最终的onSuccess处理程序执行。 奇怪的是,onCancel处理程序被调用两次: 首先来自
onNext:69, FlowableTakeUntilPredicate$InnerSubscriber (io.reactivex.internal.operators.flowable)
然后从
cancel:100, FlowableTakeUntilPredicate$InnerSubscriber (io.reactivex.internal.operators.flowable)
dispose:543, FlowableBufferTimed$BufferExactBoundedSubscriber (io.reactivex.internal.operators.flowable)
有什么建议吗?
答案 0 :(得分:0)
您正在尝试将流量控制用于其目的并非真正意义上。因此,buffer()
会使你的所有流量控制机制失败,你就会陷入困境。
同样,只要谓词成功,takeUntil()
就会取消订阅您的observable。没有&#34;排水&#34;此时,所有可接受的值已经传递到下游。
尝试使用stop
作为可观察混音模式的控件,再次,不会做你认为它做的事情。
引入ReplayProcessor
或类似的中介将允许冷源继续发送数据,即使没有订阅处于活动状态。
最终,您必须将您的疑虑分开。有几个关于将冷观测值转换为热观测值的好教程。