处理 Observable 中的错误
Handling error in Observable
问题描述
我有一个简单的 class,功能简单 buildUseCaseObservable
。函数应执行以下操作
- 先尝试从互联网获取数据
- 如果成功写入数据库
- 如果失败并出现如下异常:
ServerUnavailable
,SocketException
应该从数据库中读取数据并且应该报告错误。
- 如果收到数据,但数据为空或为空,应该从数据库中读取数据。
基本上一切都按预期工作,除了粗体点。如果在从网络获取数据时出现问题,则仅调用 onError
而不会调用 onNext
。
我发现有一个名为 onErrorResumeNext
的方法,它基本上可以满足我的需要,但在那种情况下我会丢失错误(未调用 onError
,而是调用 onNext
被称为)
问题
这样的方法是不是像onCompleteWithError
或者如果没有如何实现这样的东西才不会丢失错误?
@PerActivity
public class DataInteractor extends Interactor {
private RestService rest;
private DataService data;
@Inject
AuthorsInteractor(RestService rest, DataService data) {
this.rest = rest;
this.data = data;
}
@Override
protected Observable buildUseCaseObservable() {
return Observable.concat(
rest.getData().doOnNext(data -> data.setAuthors(authors)),
data.getData())
.first(data -> data != null && !authors.isEmpty());
}
}
不幸的是,在您的情况下,onError()
和 onNext()
似乎是互斥的。我要使用的是 class,它可以让您 return 结果和错误:
public static class Result<T> {
T data;
Throwable error;
}
然后 onErrorResumeNext()
看起来像:
.onErrorResumeNext(throwable -> new Result(data.getData(), throwable))
问题描述
我有一个简单的 class,功能简单 buildUseCaseObservable
。函数应执行以下操作
- 先尝试从互联网获取数据
- 如果成功写入数据库
- 如果失败并出现如下异常:
ServerUnavailable
,SocketException
应该从数据库中读取数据并且应该报告错误。 - 如果收到数据,但数据为空或为空,应该从数据库中读取数据。
基本上一切都按预期工作,除了粗体点。如果在从网络获取数据时出现问题,则仅调用 onError
而不会调用 onNext
。
我发现有一个名为 onErrorResumeNext
的方法,它基本上可以满足我的需要,但在那种情况下我会丢失错误(未调用 onError
,而是调用 onNext
被称为)
问题
这样的方法是不是像onCompleteWithError
或者如果没有如何实现这样的东西才不会丢失错误?
@PerActivity
public class DataInteractor extends Interactor {
private RestService rest;
private DataService data;
@Inject
AuthorsInteractor(RestService rest, DataService data) {
this.rest = rest;
this.data = data;
}
@Override
protected Observable buildUseCaseObservable() {
return Observable.concat(
rest.getData().doOnNext(data -> data.setAuthors(authors)),
data.getData())
.first(data -> data != null && !authors.isEmpty());
}
}
不幸的是,在您的情况下,onError()
和 onNext()
似乎是互斥的。我要使用的是 class,它可以让您 return 结果和错误:
public static class Result<T> {
T data;
Throwable error;
}
然后 onErrorResumeNext()
看起来像:
.onErrorResumeNext(throwable -> new Result(data.getData(), throwable))