J'utilise rxjava dans mon application Android pour gérer les demandes réseau de manière asynchrone. Maintenant, je voudrais réessayer une demande réseau ayant échoué seulement après un certain temps.
Existe-t-il un moyen d'utiliser retry () sur un observable mais de ne réessayer qu'après un certain délai?
Existe-t-il un moyen de faire savoir à l'Observable qu'il est actuellement réessayé (par opposition à essayé pour la première fois)?
J'ai jeté un coup d'œil à debounce () / throttleWithTimeout () mais ils semblent faire quelque chose de différent.
Éditer:
Je pense avoir trouvé un moyen de le faire, mais je serais intéressé soit par la confirmation que c'est la bonne façon de le faire, soit par d'autres, de meilleures façons.
Voici ce que je fais: dans la méthode call () de mon Observable.OnSubscribe, avant d'appeler la méthode Subscribers onError (), je laisse simplement le Thread dormir pendant la durée souhaitée. Donc, pour réessayer toutes les 1000 millisecondes, je fais quelque chose comme ceci:
@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);
}
}
Étant donné que cette méthode s'exécute de toute façon sur un thread IO, elle ne bloque pas l'interface utilisateur. Le seul problème que je peux voir est que même la première erreur est signalée avec un délai, donc le délai est là même s'il n'y a pas de nouvelle tentative (). Je préfère que le délai ne soit pas appliqué après une erreur mais plutôt avant une nouvelle tentative (mais pas avant le premier essai, évidemment).
Error:(73, 20) error: incompatible types: RetryWithDelay cannot be converted to Func1<? super Observable<? extends Throwable>,? extends Observable<?>>