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

  • nella casella di controllo gridview non è selezionata mentre scorri la griglia vista su e giù
  • Riferimento di una string in una risorsa di string arrays con xml
  • Come verificare la disponibilità dello spazio su storage esterno?
  • java.lang.RuntimeException: WakeLock sotto bloccato C2DM_LIB
  • Incorpora la libreria Zxing senza utilizzare l'applicazione Scanner Barcode
  • Registrazione schermo Android Wear
  • @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.

  • AppWidgetHostView non può gestire correttamente onClick / onLongClick
  • GridLayout eterogeneo
  • JavaScript si blocca nella scheda Chrome intriggers android
  • Creazione di un metodo utilizzando Haversine Formula, Android V2
  • Come implementare un elenco espandibile in un ViewPager in Android?
  • Come verificare il firebase ID token con PHP (JWT)?
  • 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.