retrofit con rxjava che gestisce eccezioni di networking a livello globale

Sto cercando di gestire eccezioni nell'applicazione a livello globale, in modo che il retrofit genera un errore, lo prendo in una certa class specifica con la logica per la gestione degli errori.

Ho un'interface

  • Utilizzare database pre-popolati con Realm
  • Errore nel file strings.xml in Android
  • Mostra il menu a comparsa quando viene cliccato l'elemento della barra di azione
  • Giochi Google Play - Applicazione in test alfa / beta - Errore 10004 al momento del login RESULT APP MISCONFIGURED
  • Come allineare correttamente PreferenzeAttività in android?
  • Retrofit Post Parametro
  • @POST("/token") AuthToken refreshToken(@Field("grant_type") String grantType, @Field("refresh_token") String refreshToken); 

    e osservabili

     /** * Refreshes auth token * * @param refreshToken * @return */ public Observable<AuthToken> refreshToken(String refreshToken) { return Observable.create((Subscriber<? super AuthToken> subscriber) -> { try { subscriber.onNext(apiManager.refreshToken(REFRESH_TOKEN, refreshToken)); subscriber.onCompleted(); } catch (Exception e) { subscriber.onError(e); } }).subscribeOn(Schedulers.io()); } 

    Quando ottengo 401 dal server (token non valido o qualche altro errore correlato alla networking) vorrei aggiornare il token e ripetere la chiamata di rest. C'è un modo per farlo con rxjava per tutte le chiamate di rest con qualche tipo di osservabile che catturerà questo errore a livello globale, gestirlo e ripetere la chiamata che lo ha buttato?

    Per ora sto usando il sobject per catturare l'errore su .subscribe () come questo

     private static BehaviorSubject errorEvent = BehaviorSubject.create(); public static BehaviorSubject<RetrofitError> getErrorEvent() { return errorEvent; } 

    e in qualche chiamata

     getCurrentUser = userApi.getCurrentUser().observeOn(AndroidSchedulers.mainThread()) .subscribe( (user) -> { this.user = user; }, errorEvent::onNext ); 

    quindi nella mia attività principale mi sottoscrivo a quel sobject di comportmento e analizzo l'errore

     SomeApi.getErrorEvent().subscribe( (e) -> { //parse the error } ); 

    ma non posso ripetere la chiamata per l'osservabile che getta l'errore.

  • Quale pacchetto per MultiDexTestRunner? android.support.multidex o com.android.test.runner
  • Come get l'utilizzo della memory corrente in android?
  • Xamarin MvvmCross Android impedisce il button di return alla visualizzazione precedente
  • Spinner - concentrarsi sul primo elemento
  • Come rilevare la dimensione dello schermo android in modo programmato (le 4 size standard)?
  • Rimuovere l'icona di notifica dalla barra di stato
  • 2 Solutions collect form web for “retrofit con rxjava che gestisce eccezioni di networking a livello globale”

    È necessario utilizzare l'operatore onErrorResumeNext(Func1 resumeFunction) , meglio spiegato nella wiki ufficiale :

    Il metodo onErrorResumeNext () restituisce un Observable che rispecchia il comportmento dell'origine Observable, a less che Observable invoca onError (), nel qual caso, piuttosto che propagare tale errore al Subscriber, onErrorResumeNext () inizierà invece a rispecchiare un secondo, backup Osservabile

    Nel tuo caso vorrei mettere qualcosa di simile:

     getCurrentUser = userApi.getCurrentUser() .onErrorResumeNext(refreshTokenAndRetry(userApi.getCurrentUser())) .observeOn(AndroidSchedulers.mainThread()) .subscribe(...) 

    where:

      private <T> Func1<Throwable,? extends Observable<? extends T>> refreshTokenAndRetry(final Observable<T> toBeResumed) { return new Func1<Throwable, Observable<? extends T>>() { @Override public Observable<? extends T> call(Throwable throwable) { // Here check if the error thrown really is a 401 if (isHttp401Error(throwable)) { return refreshToken().flatMap(new Func1<AuthToken, Observable<? extends T>>() { @Override public Observable<? extends T> call(AuthToken token) { return toBeResumed; } }); } // re-throw this error because it's not recoverable from here return Observable.error(throwable); } }; } 

    Si noti inoltre che questa function può essere facilmente utilizzata in altri casi, poiché non viene digitata con i valori effettivi emessi dall'Osservabile ripreso.

     @Override public Observable<List<MessageEntity>> messages(String accountId, int messageType) { return mMessageService.getLikeMessages(messageType) .onErrorResumeNext(mTokenTrick. refreshTokenAndRetry(mMessageService.getLikeMessages(messageType))); } 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.