Ich verwende rxjava in meiner Android-App, um Netzwerkanforderungen asynchron zu verarbeiten. Jetzt möchte ich eine fehlgeschlagene Netzwerkanforderung erst nach Ablauf einer bestimmten Zeit wiederholen.
Gibt es eine Möglichkeit, retry () auf einem Observable zu verwenden, aber erst nach einer bestimmten Verzögerung erneut zu versuchen?
Gibt es eine Möglichkeit, dem Observable mitzuteilen, dass es gerade wiederholt wird (im Gegensatz zum ersten Versuch)?
Ich habe mir debounce () / throttleWithTimeout () angesehen, aber sie scheinen etwas anderes zu tun.
Bearbeiten:
Ich glaube, ich habe einen Weg gefunden, dies zu tun, aber ich würde mich entweder für die Bestätigung interessieren, dass dies der richtige Weg ist, oder für andere, bessere Wege.
Was ich tue, ist Folgendes: In der call () -Methode meines Observable.OnSubscribe lasse ich den Thread einfach für die gewünschte Zeit schlafen, bevor ich die Methode Subscribers onError () aufrufe. Um es alle 1000 Millisekunden erneut zu versuchen, mache ich ungefähr so:
@Override
public void call(Subscriber<? super List<ProductNode>> subscriber) {
try {
Log.d(TAG, "trying to load all products with pid: " + pid);
subscriber.onNext(productClient.getProductNodesForParentId(pid));
subscriber.onCompleted();
} catch (Exception e) {
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
e.printStackTrace();
}
subscriber.onError(e);
}
}
Da diese Methode ohnehin auf einem E / A-Thread ausgeführt wird, wird die Benutzeroberfläche nicht blockiert. Das einzige Problem, das ich sehen kann, ist, dass selbst der erste Fehler mit Verzögerung gemeldet wird, sodass die Verzögerung auch dann vorhanden ist, wenn keine Wiederholung () erfolgt. Ich würde es besser finden, wenn die Verzögerung nicht nach einem Fehler, sondern vor einem erneuten Versuch angewendet würde (aber natürlich nicht vor dem ersten Versuch).
Error:(73, 20) error: incompatible types: RetryWithDelay cannot be converted to Func1<? super Observable<? extends Throwable>,? extends Observable<?>>