Sto usando rxjava nella mia app Android per gestire le richieste di rete in modo asincrono. Ora vorrei ritentare una richiesta di rete non riuscita solo dopo che è trascorso un certo tempo.
C'è un modo per usare retry () su un Observable ma per riprovare solo dopo un certo ritardo?
Esiste un modo per far sapere all'Osservabile che è attualmente in corso un nuovo tentativo (invece di provare per la prima volta)?
Ho dato un'occhiata a debounce () / throttleWithTimeout () ma sembra che stiano facendo qualcosa di diverso.
Modificare:
Penso di aver trovato un modo per farlo, ma sarei interessato a confermare che questo è il modo corretto per farlo o ad altri modi migliori.
Quello che sto facendo è questo: nel metodo call () del mio Observable.OnSubscribe, prima di chiamare il metodo Subscribers onError (), ho semplicemente lasciato dormire il Thread per il tempo desiderato. Quindi, per riprovare ogni 1000 millisecondi, faccio qualcosa del genere:
@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);
}
}
Poiché questo metodo è comunque in esecuzione su un thread IO, non blocca l'interfaccia utente. L'unico problema che posso vedere è che anche il primo errore viene segnalato con ritardo, quindi il ritardo è presente anche se non c'è retry (). Mi piacerebbe che il ritardo non fosse applicato dopo un errore ma prima di un nuovo tentativo (ma non prima del primo tentativo, ovviamente).
Error:(73, 20) error: incompatible types: RetryWithDelay cannot be converted to Func1<? super Observable<? extends Throwable>,? extends Observable<?>>