首页 > 解决方案 > 如何让 RxJava 调用 onErrorReturn() 并仍然执行 onError()

问题描述

当我调用 Retrofit 方法并且调用GetTodoRepository.fetchTodo()MainViewModel失败或任何不成功的结果结束时,我想让 RxJava 都这样做onErrorReturn()onError()这样我就可以在这种情况下返回一个缓存的对象,但仍然通知MainViewModel发生了错误,所以我可以显示与错误相关的 UI 视图。我该如何存档?

当前代码显示了我打算如何处理它。

主视图模型

public class MainViewModel extends ViewModel

    public LiveData<String> getTodo() {
    getTodoRepository.fetchTodo().subscribe(new SingleObserver<String>() {
        @Override
        public void onSubscribe(Disposable d) {
        }

        @Override
        public void onSuccess(String s) {
            showProgressAnim.setValue(false);
            todo.setValue(s);
        }

        @Override
        public void onError(Throwable e) {
            showProgressAnim.setValue(false);
            errorMsg.setValue(e.getMessage());
        }
     });
        return todo;
    }
}

GetTodoRepository

public class GetTodoRepository {

    public Single<String> fetchTodo() {
        return retrofit.create(TodoApi.class)
            .getTodo()
            .doOnSuccess(s -> cacheManager.saveTodo(s))
            .onErrorReturn(throwable -> cacheManager.getTodo())
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread());
    }
}

标签: javaandroidretrofitrx-javarx-java2

解决方案


您不能同时使用两种信号类型,Single但您可以将缓存项和错误一起fetchTodo()转换Observable并发出:

fetchTodo()
.toObservable()
.onErrorResumeNext(error -> 
     Observable.just(cached)
     .concatWith(Observable.error(error))
)

推荐阅读