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

时间:2015-11-19 16:33:30

标签: java rx-java

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

两个Observable都完成后如何运行函数?似乎像event.stopPropagation()这样的函数正在做我正在计划的事情,但据我所知,它们仅适用于具有相同结果类型的Observable,或者需要一个可以代表两种类型的复合对象。

一个简单的例子:

merge

一旦两个Observable完成任务,我需要做什么才能运行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); } });

在我的Android应用程序的特定情况下,我可以简单地将结果存储在实际的类中,有一个updateUi函数,只有当所有必需的数据已经到达时才能工作,并从两个onCompleted调用中调用此函数,但我觉得是一种更好的方式。

2 个答案:

答案 0 :(得分:1)

版本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*/ }
        });

答案 1 :(得分:0)

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

看到我的实现

更好,因为每次协调任务时都会使用它。 Reactive Stream没有内置的任务协调支持。因此,在这种情况下,承诺库或任务协调实施将会有所帮助。