【发布时间】:2020-05-13 08:09:58
【问题描述】:
当我从MainViewModel 调用Retrofit 方法GetTodoRepository.fetchTodo() 并且调用以失败或任何不成功的结果结束时,我想让RxJava 同时执行onErrorReturn() 和onError(),这样我就可以返回一个在这种情况下缓存对象,但仍然通知 MainViewModel 发生错误,因此我可以显示与错误相关的 UI 视图。如何存档?
当前代码显示了我打算如何处理它。
MainViewModel
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());
}
}
【问题讨论】:
-
您是否要同时在 ViewModel 中调用
onSuccess和onError?如果是这样,那是不可能的。onSuccess和onError是终端事件,互斥。您可以将错误视为不同的成功状态并将其传递给onSuccess。您可以返回一个对象,该对象将包含您从存储库返回的String和一个表示它是否来自缓存的标志。这样即使 API 失败,您也将始终获得成功回调。在 onSuccess 中,您可以通过result.isFromCache()之类的操作来检查它 -
@SarathKn 是的,我两个都打电话。我用普通的 Java 监听器做到了这一点,之前你可以在
GET请求失败的情况下以任何顺序或方式调用listener.onSuccess(String msg)和listener.onError(String msg)。我将如何返回一个 RxJava 标志,指示返回值isFromCache()? -
您甚至可以使用@akarnokd 建议的方法。我会用这两种方法添加一个答案
标签: java android retrofit rx-java rx-java2