2017-09-29 11 views
0

J'ai trouvé une solution (OnErrorNotImplementedException when Interceptor throws.), mais je reçois toujours OnErrorNotImplementedException et SocketTimeoutException et l'application se bloque.J'utilise rxjava2 + retrofit2 + okhttp3 dans mon application android et se bloqué lorsque l'application n'est pas connectée à internet

Mon code pour gérer résultat HTTP:

observable.compose(TransformerHelper.<Response<T>>io_main()).doOnSubscribe(new Consumer<Disposable>() { 
    @Override 
    public void accept(@io.reactivex.annotations.NonNull Disposable disposable) throws Exception { 
     requestCallback.onBefore(); 
    } 
}).doOnError(new Consumer<Throwable>() { 
    @Override 
    public void accept(@io.reactivex.annotations.NonNull Throwable throwable) throws Exception { 
     requestCallback.onAfter(); 
     requestCallback.onError(throwable); 
    } 
}).doOnComplete(new Action() { 
    @Override 
    public void run() throws Exception { 
     requestCallback.onAfter(); 
    } 
}).onErrorReturn(new Function<Throwable, Response<T>>() { 
    @Override 
    public Response<T> apply(@io.reactivex.annotations.NonNull Throwable throwable) throws Exception { 
     return null; 
    } 
}).subscribe(new Consumer<Response<T>>() { 
    @Override 
    public void accept(@io.reactivex.annotations.NonNull Response<T> response) throws Exception { 
     try { 
      requestCallback.onAfter(); 
      if (response.isSuccess()) { 
       requestCallback.onSuccess(response.data, response.msg); 
      } else { 
       requestCallback.onBizErr(response.code, response.msg); 
      } 
     } catch (Exception e) { 
      requestCallback.onAfter(); 
      requestCallback.onError(e.getCause()); 
     } 
    } 
}, new Consumer<Throwable>() { 
    @Override 
    public void accept(@io.reactivex.annotations.NonNull Throwable throwable) throws Exception { 
     requestCallback.onAfter(); 
     requestCallback.onError(throwable); 
    } 
}); 
+0

Si vous voulez augmenter vos chances d'obtenir une réponse, vous devriez probablement coller dans votre trace de pile. Aussi, pourquoi retournes-tu null dans 'onErrorReturn'. 'null' n'a pas de méthode isSuccess. – Lukasz

Répondre

0

return null; - En RxJava2 null ne peut plus être émis au courant (What's Different in 2.0). Cela signifie que le renvoi null entraînera simplement l'émission d'un NPE à la place. Pour le dire simplement, vous devrez soit définir un remplacement valide pour une demande ayant échoué, soit définir un moyen de traiter l'exception. Sinon, il sera géré par le gestionnaire d'exceptions par défaut qui bloque l'application.