RxJava2 - 链接发出不同类型的可观察对象

时间:2018-03-08 15:44:46

标签: android rx-java2

我正在学习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),以便活动可以相应地更新视图?

感谢。

1 个答案:

答案 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