İletişim için bir Android uygulamasında RxJava ile Retrofit kullanıyorum ve yanıtı tamam yanıt veren HTTP yanıtından (status 200 code) çözümlemede hatayla uğraşmak zorundayım.RxJava retrySonra yayımı yeniden gönderirken
Ayrıca, yeniden deneme yapılıp yapılmayacağına karar vermek için kullanıcının girişine bağlı retryWhen
operatörünü kullanarak hatayı işlemenin bir yolunu uygulamış oldum. Bu, özgün Observable
'a yeniden göndererek çalışır. Hizmet tekrar çağrılmaz Bununla
services.getSomething()
.map(response -> {
if (checkBadResponse(response)) {
throw new RuntimeException("Error on service");
} else {
return parseResponse(response);
}
}).retryWhen(this::shouldRetry);
:
denedim ilk yaklaşım
böyle bir şey olması idi.retryWhen
operatörünün hizmetin
Observable
numarasına yeniden abone olamayacağı anlaşılıyor.
ileri onCompleted
göndermek ve aşağıdaki gibi lift
ile kullanmayan başka operatöre hayata geçiren çalışma sonunda Ne: Kullanılması
public class CheckResponseStatus<T> implements Observable.Operator<ResponsePayload<T>, ResponsePayload<T>> {
@Override
public Subscriber<? super ResponsePayload<T>> call(Subscriber<? super ResponsePayload<T>> subscriber) {
return new Subscriber<ResponsePayload<T>>() {
private boolean hasError = false;
@Override
public void onCompleted() {
if (!hasError)
subscriber.onCompleted();
}
@Override
public void onError(Throwable e) {
hasError = true;
subscriber.onError(e);
}
@Override
public void onNext(ResponsePayload<T> response) {
if (response.isOk()) {
subscriber.onNext(response);
} else {
hasError = true;
subscriber.onError(new RuntimeException(response.getMessage()));
}
}
};
}
}
hoşuna:
services.getSomething()
.lift(new CheckResponseStatus())
.map(response -> parseResponse(response))
.retryWhen(this::shouldRetry);
bu mu Onunla uğraşmanın doğru yolu ya da daha basit, daha iyi bir yolu var mı?
Eğer '.retryWhen' öğesini kaldırırsanız, Gözlemcinizde' onError 'mesajını alıyor musunuz? – Haspemulator
Evet, yapıyorum! Hata normal olarak yayılır. – alcarv
'RetryWhen', kendisine sağlanan işlevin yeniden gönderilmesini nasıl sağlayabileceğinizi anlamanız açısından özellikle zor bir operatördür. Kodundan çözebildiğim, gelenleri göz ardı edemeyeceğinizi ve zincirlemeniz gerektiğini. – akarnokd