Java 使用回退可观察x次数
我有一个Observable,它在下一个方法中实现了错误处理Java 使用回退可观察x次数,java,android,rx-java,reactive-programming,rx-android,Java,Android,Rx Java,Reactive Programming,Rx Android,我有一个Observable,它在下一个方法中实现了错误处理 getMyObservable(params) .take(1) .doOnError(e -> { }) .onErrorResumeNext(throwable -> { if (throwable.getMessage().contains("401"
getMyObservable(params)
.take(1)
.doOnError(e -> {
})
.onErrorResumeNext(throwable -> {
if (throwable.getMessage().contains("401")) {
return getMyObservable(params);
} else {
sendServerCommunicationError();
return Observable.error(throwable);
}
})
.subscribe(result -> {
... }
});
GetMyObservable从生成的客户端返回web服务请求。用例是:如果我们收到401,我们可能需要用新的UserToken刷新客户端。这就是为什么我们在OneRorResumeNext中使用可观察的回退,而不能只使用重试
我有一些问题:
为什么我需要实现doon错误?如果我没有实现它,我有时会得到一个onError not implemented异常。我想,当我使用OneRorResumeNext时,如果出现错误,会自动使用此方法。
在401等特定错误上,我如何实现这一点?我使用了一个可观察到的回退时间,在回退5次后,我产生了一个错误。那么,我是否可以以某种方式将retryWhen和OneRorResumeNext结合起来,或者是否可以采用不同的方式?
为什么我需要实现doon错误
您不需要这样做,并且doError不是一个错误处理程序,而是一个错误通道。您必须在subscribe中实现一个错误处理程序:
我如何在特定的错误(如401)上实现这一点?我使用了一个可观察的回退时间,回退时间为5次之后
在以下情况下使用retryWhen:
但是当我使用Retry时,当我不使用回退观测值时。你的回退观测值是什么?你最初的问题表明你再次调用getMyObservable。我已经将答案更新为使用延迟,以防调用本身除了返回可观察对象运行之外还有副作用。这就是我想要的。但return Observable.errornew exception重试5次失败;不工作:Observable无法转换为ObservableSourceSpecify类型参数:Observable.error。。。;。
.subscribe(result -> {
// ...
},
error -> {
// ...
});
Observable.defer(() -> getMyObservable(params))
.retryWhen(errors -> {
AtomicInteger count = new AtomicInteger();
return errors.flatMap(error -> {
if (error.toString().contains("401")) {
int c = count.incrementAndGet();
if (c <= 5) {
return Observable.timer(c, TimeUnit.SECONDS);
}
return Observable.error(new Exception("Failed after 5 retries"));
}
return Observable.error(error);
})
})