ObservableEmitter的onError需要传入一个Throwable实例,但如果我只有一些错误数据,最佳做法是什么?如下所示:
Observable<JSONObject> o1 = Observable.create(new ObservableOnSubscribe<JSONObject>() {
@Override
public void subscribe(final ObservableEmitter<JSONObject> e) throws Exception {
RemoteApi.getInstance().addR(context, tag, new AsyncCallback<JSONObject, Error>() {
@Override
public void onSuccess(JSONObject result) {
if(e.isDisposed()) {
return;
}
e.onNext(result);
e.onComplete();
}
@Override
public void onFailure(Error error) {
if(e.isDisposed()) {
return;
}
e.onError(new Throwable(error.getCode() + " " + error.getMessage()));
}
});
}
});
如何正确传递错误数据?我只是为这种异常创建一个包装类:
private static class RxJavaExceptionError extends Exception {
private Object object;
public RxJavaExceptionError(Object object) {
this.object = object;
}
public Object get() {
return object;
}
}
我使用对象成员传递数据。但是我发现我需要很多人使用instanceof来确定它是否是RxJavaExceptionError,这不是很令人愉快。那么这种情况下的最佳做法是什么?我不认为这是一个不寻常的案例。
我清楚地表达了吗?我的英语不太好。
答案 0 :(得分:0)
抱歉,我不太了解您的用例。如果您想要抛出错误并通过管道传播,您是否尝试过运算符onErrorResumeNext?
/**
* Here we can see how onErrorResumeNext works and emit an item in case that an error occur in the pipeline and an exception is propagated
*/
@Test
public void observableOnErrorResumeNext() {
Subscription subscription = Observable.just(null)
.map(Object::toString)
.doOnError(failure -> System.out.println("Error:" + failure.getCause()))
.retryWhen(errors -> errors.doOnNext(o -> count++)
.flatMap(t -> count > 3 ? Observable.error(t) :
Observable.just(null).delay(100, TimeUnit.MILLISECONDS)),
Schedulers.newThread())
.onErrorResumeNext(t -> {
System.out.println("Error after all retries:" + t.getCause());
return Observable.just("I save the world for extinction!");
})
.subscribe(s -> System.out.println(s));
new TestSubscriber((Observer) subscription).awaitTerminalEvent(500, TimeUnit.MILLISECONDS);
}
如果您想查看更多示例请点击此处