如何仅当响应为 404 时才在 RxJava2 中重试

avi*_*mez 2 java retrofit rx-java2

我使用 Retrofit 和 RxJava2 实现了一个重试调用,但是我需要它仅在您获得与 404 不同的代码时重试。重试 404 是没有意义的。这就是我正在使用的

new RequestFactory()
    .requestBuilder
    .create(Service.class)
    .getData(id)
    .map(response -> response.object)
    .doOnError(t -> Log.e(NET, "Error fetching data id '" + id + "': " + t))
    .retry(3)
    .onErrorResumeNext(Observable.empty())
    .subscribeOn(Schedulers.io())
Run Code Online (Sandbox Code Playgroud)

Bob*_*ish 5

您可以使用另一种形式retry()来有条件地重试。

...
.retryWhen( error -> error.flatMap( responseType -> checkResponseType( responseType ) ) )
...
Run Code Online (Sandbox Code Playgroud)

进而

Observable<Boolean> checkResponseType( ResponseException response ) {
  if ( response.getCode() == 404 ) {
    return Observable.error( response );
  }
  return Observable.just( Boolean.TRUE );
}
Run Code Online (Sandbox Code Playgroud)

这将监视您收到的错误响应并检查 404 值。如果是404,则不会重试,否则会重试。