繁体   English   中英

RxJava:当两个不同结果类型的observable完成时调用函数

[英]RxJava: call function when two observables with different result types are completed

我正在开发一个 Android 应用程序,该应用程序通过我通过 RxJava Observables 访问的 API 检索两个不同的对象。 要更新 UI,我需要两个结果。

两个 Observable 都完成后,如何运行函数? 看起来像merge这样的函数正在做我计划的事情,但据我所知,它们只适用于具有相同结果类型的 Observables 或者需要一个可以表示两种类型的复合对象。

一个简单的例子:

Observable.just("Hello world")
        .subscribe(new Action1<String>() {
            @Override
            public void call(String s) {
                System.out.println(s);
            }
        });
Observable.just(1, 2, 3, 4, 5, 6)
        .subscribe(new Action1<Integer>() {
            @Override
            public void call(Integer i) {
                System.out.println(i);
            }
        });

一旦两个 Observable 都完成了他们的任务,我需要做什么来运行System.out.println("Finished!")

在我的 Android 应用程序的特殊情况下,我可以简单地将结果存储在实际类中,有一个 updateUi 函数,该函数仅在所有必需的数据都已到达时才起作用,并从两个 onCompleted 调用中调用此函数,但我觉得有一个更好的道路。

版本 2:发出的项目作为“侧”动作处理,只有onCompleted事件通过合并的 observable。

Observable<String> stringObservable = Observable.just("Hello world")
        .doOnNext(System.out::println)
        .ignoreElements();
Observable<Integer> integerObservable = Observable.just(1, 2, 3, 4, 5, 6)
        .doOnNext(System.out::println)
        .ignoreElements();

Observable.merge(stringObservable, integerObservable)
        .subscribe(new Subscriber<Object>() {
            @Override
            public void onCompleted() {
                System.out.println("Finished!");
            }

            @Override
            public void onError(Throwable throwable) {
                /*optionally handle if one of the observables calls onError()*/
            }

            @Override
            public void onNext(Object o) { /*not called*/ }
        });

我认为,您需要一个 TaskCoordinator。 在 taskCoordinator 中保留一个简单的计数器。 每次您发出成功信号时,计数器都会递减。 当计数器达到零时,将执行回调。 你可以在这里看到我的实现https://github.com/codefacts/crm-common/blob/master/src/main/java/io/crm/util/TaskCoordinator.java

更好,因为,每次协调任务时,它都会用到。 Reactive Stream 没有内置支持任务协调。 因此,在这种情况下,promise 库或任务协调实现将很有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM