我从源观察中尝试将其拆分为两个可观察对象。然后压缩这个新闻可观察数据。
| +--- 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()
? (然后不要错过任何活动)
答案 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