java - 如何让 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());
}
}
解决方案
您不能同时使用两种信号类型,Single
但您可以将缓存项和错误一起fetchTodo()
转换Observable
并发出:
fetchTodo()
.toObservable()
.onErrorResumeNext(error ->
Observable.just(cached)
.concatWith(Observable.error(error))
)
推荐阅读
- laravel-5 - laravel 5.8 - 创建和更新用户的个人资料
- c - 如何访问内存?
- javascript - 监听窗口属性变化
- angular - 如何将 3 个数据数组合并到一个可迭代数组中?
- ios - “GIDSignIn”类型的值没有成员“presentingViewController”
- javascript - 如何从 mysql 表中评估 php 代码(代码包含 javascript 代码)
- php - PHP/Laravel - Short(er)hand 如果只有 true
- java - 导出后,java无法显示图像
- python - 无法使用请求解析网页中不同项目的链接
- vue.js - 在vuex中循环处理表单?