refCount:在" n"之后调用底层的ConnectObservable.connect()观察者是相互联系的

时间:2014-10-17 13:36:28

标签: java reactive-programming observable rx-java

我从源观察中尝试将其拆分为两个可观察对象。然后压缩这个新闻可观察数据。

              |
         +--- A ---+
         |         |
         V         V
         B         C
         |         |
         +-> zip <-+
              |
              V

从代码的角度来看:

public Observable<Integer> doTheDev(Observable<Integer> A) {

    // share() == publish().refCount();
    Observable<Integer> bridge = A.share().subscribeOn(Schedulers.computation());

    Observable<Integer> B = bridge.count();
    Observable<Integer> C = bridge.sum();

    return Observable.zip(B, C, (b, c) -> b + c);
}

作为RxJava documentation show:只要第一个Observable订阅,refCount()就会在基础connect()上调用ConnectableObservable

是否有可能通过某种方式等待第n次观察者订阅呼叫connect()? (然后不要错过任何活动)

1 个答案:

答案 0 :(得分:0)

我试着这样做。不知道(还)是否存在更好,更简单的解决方案。

我编写了一个新的运算符,它与refCount完全相同(事实上,我复制了refCount源代码......)但是,在第一个订阅服务器上进行订阅时,它只在第n个订阅服务器上连接。

我只更改了我的新运算符的call方法中的这部分代码:

if (id >= numberOfSub) {
    connect(t);
}

所以,在我的应用程序中,我可以按照以下方式使用它:

private static Observable<Double> averageOf(Observable<Double> data, Scheduler scheduler) {

    ConnectableObservable<? extends Double> hot = data
            .publish();

    // call the underlying connect() after the 2nd subscription
    Observable<Double> bridge = Observable.create(new OnSubscribeRefCountN<>(hot, 2))
            .subscribeOn(scheduler);

    Observable<Double> count = bridge.count()
            .map(Integer::doubleValue);

    Observable<Double> sum = bridge.reduce(0.0, (seed, e) -> seed + e);

    return Observable.zip(sum, count, (s, c) -> s / c);
}

您可以在此处找到OnSubscribeRefCountN代码:https://github.com/bric3/demo-rxjava-humantalk/blob/d6227559b36fcafc08c0d8b894584400694d9a15/src/main/java/demo/humantalk/rxjava/operators/OnSubscribeRefCountN.java#L69