Ich habe festgestellt, dass der von Sinan Kozak bereitgestellte Weg (OKHttpClient Intercepter) nicht funktioniert, wenn die http-Verbindung fehlschlägt. Es gibt noch nichts, was die HTTP-Antwort betrifft.
Also benutze ich eine andere Möglichkeit, um das Observable-Objekt zu verknüpfen, und rufe .retryWhen auf. Außerdem habe ich retryCount Limit hinzugefügt.
import retrofit2.Call;
import retrofit2.CallAdapter;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.HttpException;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.jackson.JacksonConverterFactory;
import rx.Observable;
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
Dann
RxJavaCallAdapterFactory originCallAdaptorFactory = RxJavaCallAdapterFactory.create();
CallAdapter.Factory newCallAdaptorFactory = new CallAdapter.Factory() {
@Override
public CallAdapter<?> get(Type returnType, Annotation[] annotations, Retrofit retrofit) {
CallAdapter<?> ca = originCallAdaptorFactory.get(returnType, annotations, retrofit);
return new CallAdapter<Observable<?>>() {
@Override
public Type responseType() {
return ca.responseType();
}
int restRetryCount = 3;
@Override
public <R> Observable<?> adapt(Call<R> call) {
Observable<?> rx = (Observable<?>) ca.adapt(call);
return rx.retryWhen(errors -> errors.flatMap(error -> {
boolean needRetry = false;
if (restRetryCount >= 1) {
if (error instanceof IOException) {
needRetry = true;
} else if (error instanceof HttpException) {
if (((HttpException) error).code() != 200) {
needRetry = true;
}
}
}
if (needRetry) {
restRetryCount--;
return Observable.just(null);
} else {
return Observable.error(error);
}
}));
}
};
}
};
Dann hinzufügen oder ersetzen
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
mit
.addCallAdapterFactory(newCallAdaptorFactory)
Zum Beispiel:
return new Retrofit
.Builder()
.baseUrl(baseUrl)
.client(okClient)
.addCallAdapterFactory(newCallAdaptorFactory)
.addConverterFactory(JacksonConverterFactory.create(objectMapper));
Hinweis: Der Einfachheit halber behandle ich HTTP-Code> 404-Code nur als Wiederholungsversuch. Bitte ändern Sie ihn selbst.
Wenn die http-Antwort 200 ist, wird die oben rx.retryWhen
genannte Antwort nicht aufgerufen. Wenn Sie darauf bestehen, eine solche Antwort zu überprüfen, können Sie sie rx.subscribeOn(...throw error...
vor .retryWhen hinzufügen .