Ho una chiamata di aggiornamento e desidero richiamarla ogni 30 secondi. Per fare questo io uso un Observable.interval(0, 30, TimeUnit.SECONDS)
RxJava + Retrofit + polling
Observable
.interval(0, 30, TimeUnit.SECONDS)
.flatMap(x -> RestApi.instance().getUsers())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(list -> {
// ...
},
error -> Timber.e(error, "can't load users"));
Il mio problema: se la chiamata API non riesce, onError
si chiama e le unsubscribes sottoscrizione e per il polling non funziona più :-(
Per catturare l'errore api ho aggiunto un retryWhen
Observable
.interval(0, 30, TimeUnit.SECONDS)
.flatMap(x -> RestApi.instance().getUsers()
.retryWhen(errors -> errors
.flatMap(error -> Observable.timer(15, TimeUnit.SECONDS))))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(list -> {
// ...
},
error -> Timber.e(error, "can't load users"));
Questo cattura l'errore, ma ottengo più chiamate API nel tempo. Ogni 30 secondi ottengo un nuovo segnale sondaggio che termina in una nuova richiesta di api. ma se la richiesta API non riesce esso si ritenta . Così io avere una nuova richiesta più tutti i tentativi.
La mia domanda: come posso gestire un errore API senza annullare l'iscrizione dal segnale di polling?
Conosco il primo articolo ma non il secondo. Il secondo descrive un problema simile e ha una soluzione :-) –