我有一个可连接的观察者,有多个订阅者。
每个订阅者计算一些业务逻辑。例如,一个订阅者存储在每个onNext
调用中产生数据库,其他订阅者在内存中累积它的结果,并且当onCompleted
被调用时将它们写入文件。我想知道他们什么时候都完成了他们的工作,所以我可以继续做其他事情(与其他可连接的观察者聚合,从数据库中读出输出的数据等)。
这就是我观察终止的方式。它只能工作,因为订阅者在与观察者相同的线程中执行。
public Observable<Boolean> observeTermination() {
return Observable.defer(() -> {
try {
start();
return Observable.just(true);
} catch (RuntimeException e) {
return Observable.just(false);
}
});
}
void start() {
Observable<List<Foo>> fooBatchReaderObservable = fooBatchReader.createObservable(BATCH_SIZE);
ConnectableObservable<List<Foo>> connectableObservable = fooBatchReaderObservable.publish();
subscribers.forEach(s -> connectableObservable.subscribe(s));
connectableObservable.connect();
}
因此,当observeTermination
被调用时,我不想在start
方法中执行逻辑,但只有当有人订阅它时。
有没有办法让观察更好?
嗯,这一切都很糟糕。问题是我需要在某个地方的observable上调用connect
并返回boolean
结果作为终止的终止。
答案 0 :(得分:0)
不是一个正确的答案,但它需要空间来正确解释。如果你可以处理Observable而不是订阅者会更容易;这样可以更灵活地编写它们;
鉴于您有components
:
Collection<Function<Observable<T>, Observable<?>>> components:
Observable<T> tObs = ... .publish().autoConnect(components.size());
Observable
.from(components)
.flatMap(component -> component.apply(tObs))
.ignoreElements()
.doOnTerminate() // or .defaultIfEmpty(...), or .switchIfEmpty(...)
.subscribe(...);
事实上,我说你甚至不应该在这里订阅,只需创建observable并将其返回,让它可用于代码其他部分的合成。