我正在学习RxJava2,我需要链接三个observable:
第一个对数据执行操作:
Completable performOperations(Data data); // performs expensive operations.
第二个将数据上传到server1并发出百分比进度。
Observable<Integer> uploadToServer1(Data data); // while it performs the upload, it calls several times onNext(progress) and finally calls onComplete().
第三个通知服务器2上传已完成。
Completable informUploadedToServer2(Data data); // just calls a REST API.
我想在第二个观察者的活动中显示进度,并在第三个成功完成时最终显示成功。如果三个observable中的任何一个抛出异常,我也应该在Activity中显示错误。
我尝试使用concat
进行链接,但不会编译,因为uploadToServer1
会发出整数类型而其余的则不会。
public void upload(Data data, MyCallback callback) {
Observable.concat(performOperations(data).toObservable(), uploadToServer1(data), informUploadedToServer2(data))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new DisposableObserver<Integer>() {
@Override
public void onNext(Integer integer) {
callback.onProgressChanged(integer);
}
@Override
public void onError(Throwable e) {
callback.onError();
}
@Override
public void onComplete() {
callback.onSuccess();
}
});
}
如果我换到
,我已经看到了Observable.concat(performOperations(data).<Integer>toObservable(), uploadToServer1(data), informUploadedToServer2(data).<Integer>toObservable())
它会起作用,但这是推荐的方法吗?
更重要的是,如果第一个observable发出非整数?,例如,一个DataDiff
对象会在执行某个操作后描述修改,该怎么办:
Observable<DataDiff> performOperations(Data data);
我应该如何订阅以便我可以收听onNext(Integer)
和onNext(DataDiff)
,以便活动可以相应地更新视图?
感谢。
答案 0 :(得分:3)
我会以不同的方式做到这一点,更多&#34;流畅&#34;方法
首先onViewAttachedToWindow()
,然后使用performOperations()
运算符与andThen
连接,然后您可以使用Observable<Integer>
,以便之后{{1}的所有元素发出的concatWith
被执行。然后,您可以处理订阅消费者中发出的Observable<Integer>
,如果您informUploadedToServer2
可以安全地通知您Integer
那里
observeOn(AndroidSchedulers.mainThread)
如果你需要拦截其中一个流的完成,你可以使用Activity
,例如
performOperations(data)
.andThen(uploadToServer1(data))
.concatWith(informUploadedToServer2(data))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
// notify your Activity here
}
});
如果doOnComplete
返回了performOperations(data)
.doOnComplete(new Action() {
@Override
public void run() throws Exception {
// after performOperations has completed but before
// uploadToServer1 has started
}
})
.andThen(uploadToServer1(data))
// ...
,您可以使用performOperations()
拦截所有事件,然后使用Observable<DataDiff>
运算符将其转换为doOnNext
然后像以前一样使用ignoreElements
Completable