我试图熟悉反应性背压处理问题,特别是通过阅读此维基:https://github.com/ReactiveX/RxJava/wiki/Backpressure
In the buffer paragraph,我们有更多涉及的示例代码:
// we have to multicast the original bursty Observable so we can use it
// both as our source and as the source for our buffer closing selector:
Observable<Integer> burstyMulticast = bursty.publish().refCount();
// burstyDebounced will be our buffer closing selector:
Observable<Integer> burstyDebounced = burstMulticast.debounce(10, TimeUnit.MILLISECONDS);
// and this, finally, is the Observable of buffers we're interested in:
Observable<List<Integer>> burstyBuffered = burstyMulticast.buffer(burstyDebounced);
如果我理解正确,我们通过为缓冲区运营商生成去抖动信号流来有效地去除突发源流。
但为什么我们需要在这里使用发布和引用计数器?如果我们放弃它们会导致什么问题?评论不会让我更清楚,默认情况下RxJava Observables不能进行多播吗?
答案 0 :(得分:3)
答案在于hot and cold可观测量之间的区别。
缓冲区运算符组合了两个流,无法知道它们有一个共同的源(在您的情况下)。当激活(订阅)时,它会同时订阅它们,作为回报,它将触发对原始输入的2个不同订阅。
现在有2件事可能发生,要么输入是热观察,要么订阅没有效果,只能注册监听器,一切都会按预期工作,或者它是冷可观察的,每个订阅都会产生在潜在的不同和不同步的流中。
例如,cold observable可以是在订阅时执行网络请求并通知结果的。不调用发布意味着将完成2个请求。
发布+ refcount / connect是将冷可观察变为热点的常用方法,确保单个订阅将发生,并且所有流的行为都相同。