Estoy usando rxjava en mi aplicación de Android para manejar solicitudes de red de forma asincrónica. Ahora me gustaría volver a intentar una solicitud de red fallida solo después de que haya pasado un cierto tiempo.
¿Hay alguna forma de usar retry () en un Observable pero reintentar solo después de un cierto retraso?
¿Hay alguna manera de hacerle saber al Observable que se está reintentando actualmente (en lugar de intentarlo por primera vez)?
Eché un vistazo a debounce () / throttleWithTimeout () pero parecen estar haciendo algo diferente.
Editar:
Creo que encontré una forma de hacerlo, pero me interesaría la confirmación de que esta es la forma correcta de hacerlo o de otras formas mejores.
Lo que estoy haciendo es esto: en el método call () de mi Observable.OnSubscribe, antes de llamar al método Subscribers onError (), simplemente dejo que el Thread duerma durante la cantidad de tiempo deseada. Entonces, para volver a intentarlo cada 1000 milisegundos, hago algo como esto:
@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);
}
}
Dado que este método se ejecuta en un subproceso IO de todos modos, no bloquea la interfaz de usuario. El único problema que puedo ver es que incluso el primer error se informa con retraso, por lo que el retraso existe incluso si no hay reintento (). Me gustaría más si el retraso no se aplicara después de un error, sino antes de un reintento (pero no antes del primer intento, obviamente).
Error:(73, 20) error: incompatible types: RetryWithDelay cannot be converted to Func1<? super Observable<? extends Throwable>,? extends Observable<?>>