Ich benutze Retrofit + RxJava in meinem Android-Projekt. Aber mein Webservice hat Grenzen (1 Request \ Sekunde). Wenn ich also häufig auf die Schaltfläche "Load" klicke, wird JSON mit einem Fehler zurückgegeben. Frage: Mit welchem RxJava-Operator kann ich Abfragen erneut senden, solange sie nicht erfolgreich sind? Jetzt habe ich nur onError Methode aufgerufen und das wars.Wie können Sie Anfragen senden, solange sie in RxJava nicht erfolgreich sind?
1
A
Antwort
0
Verwenden Sie retryWhen Operator, mit 1 Sekunde Verzögerung in Ihrem spezifischen Anwendungsfall.
Hier ist eine detaillierte Erklärung zu demselben Thema von Dan Lew, http://blog.danlew.net/2016/01/25/rxjavas-repeatwhen-and-retrywhen-explained/
0
Sie müssen überprüfen, ob die json nicht ist, wie Sie möchten, wenn es ist nicht Sie eine Laufzeit-Exception werfen kann, dann retryWhen verwenden, Sie können versuchen, den JSON erneut zu erhalten. Wenn alle Versuche fehlschlagen, können Sie den letzten Fehler mit dem Operator onErrorResumeNext erhalten und dann einen Standard-JSON zurückgeben, wenn Sie möchten.
int count = 0;
@Test
public void observableOnErrorResumeNext() {
Subscription subscription = Observable.just(new JsonObject())
.doOnNext(json -> if(json == BAD_JSON){ throw RuntimeException() })
.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("You can return here a default Json");
})
.subscribe(s -> System.out.println(s));
new TestSubscriber((Observer) subscription).awaitTerminalEvent(500, TimeUnit.MILLISECONDS);
}
Sie können weitere Beispiele sehen, wenn Sie hier benötigen. https://github.com/politrons/reactive
haben Sie versucht '' retry''? -http: //reactivex.io/documentation/operators/retry.html - Ich bin mir nicht sicher, aber ich denke, dass es die Anfrage nicht wirklich wiederholt, aber ich dachte, du könntest es versuchen, da du bereits ein Projekt hast Setup – Fred
'DrosselErst'? es wird das erste Ereignis ausgeben und die nächsten Ereignisse während des Intervalls überspringen (hier 1 Sekunde) – dwursteisen