RxJava:当具有不同结果类型的两个可观察对象完成时调用函数
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 应用程序的特定情况下,我可以简单地将结果存储在实际的 class 中,有一个 updateUi 函数,它只在所有需要的数据都已经到达时才起作用,并调用它来自两个 onCompleted 调用的函数,但我觉得有更好的方法。
我认为,您需要一个 TaskCoordinator。在 taskCoordinator 中保留一个简单的计数器。每次发出成功信号时,计数器都会递减。当计数器归零时,将执行回调。你可以在这里看到我的实现方式 https://github.com/codefacts/crm-common/blob/master/src/main/java/io/crm/util/TaskCoordinator.java
更好是因为,每次协调任务,它都会派上用场。 Reactive Stream 没有内置对任务协调的支持。因此,在这种情况下,promise 库或任务协调实施将很有帮助。
版本 2:发出的项目作为 "side" 操作处理,只有 onCompleted
事件通过合并的可观察对象。
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*/ }
});
我正在开发一个 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 应用程序的特定情况下,我可以简单地将结果存储在实际的 class 中,有一个 updateUi 函数,它只在所有需要的数据都已经到达时才起作用,并调用它来自两个 onCompleted 调用的函数,但我觉得有更好的方法。
我认为,您需要一个 TaskCoordinator。在 taskCoordinator 中保留一个简单的计数器。每次发出成功信号时,计数器都会递减。当计数器归零时,将执行回调。你可以在这里看到我的实现方式 https://github.com/codefacts/crm-common/blob/master/src/main/java/io/crm/util/TaskCoordinator.java
更好是因为,每次协调任务,它都会派上用场。 Reactive Stream 没有内置对任务协调的支持。因此,在这种情况下,promise 库或任务协调实施将很有帮助。
版本 2:发出的项目作为 "side" 操作处理,只有 onCompleted
事件通过合并的可观察对象。
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*/ }
});