Gérer les erreurs du réseau grâce à la modernisation observable

lors de L'utilisation D'Observables avec Retrofit, comment gérer une défaillance du réseau?

compte tenu de ce code:

Observable<GetJobResponse> observable = api.getApiService().getMyData();
observable
    .doOnNext(new Action1<GetJobResponse>() {
        @Override
        public void call(GetJobResponse getJobResponse) {
            //do stuff with my data
        }
    })
    .doOnError(new Action1<Throwable>() {
        @Override
        public void call(Throwable throwable) {
            //do stuff with error message
        }
    });

la requête échoue simplement sans réseau et onError n'est pas appelé. Il ne plante pas, mais échoue silencieusement. Logs montre Retrofit obtenir l'erreur:

 java.net.UnknownHostException: Unable to resolve host "api-staging.sittercity.com": No address associated with hostname
     at java.net.InetAddress.lookupHostByName(InetAddress.java:424)
     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
     at java.net.InetAddress.getAllByName(InetAddress.java:214)
     at com.squareup.okhttp.internal.Dns.getAllByName(Dns.java:29)

utilisation des callbacks ceci est simplement passé à l'onfailure(erreur de RetrofitError). Comment faire surface avec RxJava?

20
demandé sur Patrick 2014-08-09 02:18:40

4 réponses

mon problème était en fait ailleurs dans mon code. La gestion des erreurs de réseau avec RxJava + Retrofit est très facile car il lance juste un RetrofitError dans la méthode onError:

 @Override
 public void onError(Throwable e) {
     if (e instanceof RetrofitError) {
        if (((RetrofitError) e).isNetworkError()) {
            //handle network error
        } else {
            //handle error message from server
        }
     }
 }
32
répondu Patrick 2014-08-11 13:42:18

il s'agit purement d'une question de RxJava, qui n'implique pas tant de travaux de rénovation. doOnError est un effet secondaire, donc, même si elle gère l'erreur, il n'est pas "attraper" dans le sens de l'empêchant de propagation vers l'avant.

Vous devriez regarder Traitement Des Erreurs Opérateurs. L'option la plus basique est onErrorReturn() ce qui vous permet de remplacer une erreur par un élément (instance de