继续下一个Observable onError

时间:2015-12-16 18:25:30

标签: android rx-java rx-android

我要完成一系列任务,如果其中任何一个抛出异常,则希望继续执行下一个任务。

但是通过这种实现,如果第一次REST调用失败,它会在订阅者中抛出onError。

想知道什么是最好的运算符,或者我需要调用其他函数来使其在异常时恢复。

private void logout() {
    // Observable from Retrofit to make logout service call
    requestLogout()
            .doOnNext(o -> {
                clearNotifications();
            })
            .doOnNext(o -> {
                unregisterGcm();
            })
            .doOnNext(o -> {
                clearLocalData();
            })
            .doOnNext(o -> {
                // clear all jobs
                mJobManager.clear();
            })
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Subscriber<Object>() {
                @Override
                public void onCompleted() {
                    // no op
                }

                @Override
                public void onError(Throwable e) {
                    mView.navigateToLogin();
                }

                @Override
                public void onNext(Object o) {
                    mView.navigateToLogin();
                }
            });
}

2 个答案:

答案 0 :(得分:0)

如果您只想重新订阅使用Observable.retry()

.observeOn(AndroidSchedulers.mainThread())
.retry().subscribe(new Subscriber<Object>() {
 // rest of code

答案 1 :(得分:0)

所以我找到了执行所有Observable的方法,即使其中一个有错误。但这并不能保持秩序。

我仍然在寻找保留订单的方法,如果出现错误,它应该继续下一个可观察的。

Observable.mergeDelayError(requestLogout(),
            clearNotifications(),
            unregisterGcm(),
            clearLocalData(),
            clearJobs())
            .first()
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Subscriber<Object>() {
                           @Override
                           public void onCompleted() {
                               // no op
                           }

                           @Override
                           public void onError(Throwable e) {
                               mView.navigateToLogin();
                           }

                           @Override
                           public void onNext(Object o) {
                               mView.navigateToLogin();
                           }
                       }
            );