2017-09-08 17 views
0

J'ai joué avec retryWhen() méthode et j'ai remarqué que si vous utilisez filtre() intérieur retryWhen() et si filtre() échoue il n'y a pas de rappel exécuté même pas onCompleted(). Pouvez-vous m'expliquer pourquoi cela se passe? Merci d'avance.RxJava2 à l'aide retryWhen avec filtre

Le cas de travail:

Observable.error(new RuntimeException()) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .retryWhen(errors -> errors 
        .filter(throwable -> throwable instanceof RuntimeException) 
        .zipWith(Observable.range(1, 3), (throwable, retryCount) -> { 
         Log.i("lol", "retry " + retryCount); 
         return retryCount; 
        })) 
      .subscribe(e -> Log.i("lol", "onNext"), throwable -> Log.i("lol", "onError"),() -> Log.i("lol", "onCompleted")); 

La sortie de travail:

I: retry 1 
I: retry 2 
I: retry 3 
I: onCompleted 

Mais quand je l'ai changé le filtre avec filter(throwable -> throwable instanceof IOException) l'observable est comme dans un état congelé. Aucun rappel n'a été déclenché.

Observable.error(new RuntimeException()) 
       .subscribeOn(Schedulers.io()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .retryWhen(errors -> errors 
         .filter(throwable -> throwable instanceof IOException) 
         .zipWith(Observable.range(1, 3), (throwable, retryCount) -> { 
          Log.i("lol", "retry " + retryCount); 
          return retryCount; 
         })) 
       .subscribe(e -> Log.i("lol", "onNext"), throwable -> Log.i("lol", "onError"),() -> Log.i("lol", "onCompleted")); 

Répondre

1

Vous ne voulez pas utiliser filter() dans l'opérateur retryWhen(). Au lieu de cela, utilisez une instruction if ou une instruction switch pour vous assurer d'avoir une couverture complète de tous les cas.

La façon dont retryWhen() fonctionne est qu'il crée un observable et en invoquant la fonction avec lui. Quand il attrape le lanceable dans sa méthode onError(), il émet ce jetable dans l'observable et attend le résultat. S'il n'y a pas de résultat, comme quand un jetable est filtré, il attendra pour toujours.

+0

Merci pour l'info.Yeah J'utilisais l'instruction 'if' mais je voulais juste essayer si ça fonctionnait avec' filter() 'aussi. Bien que je m'attendrais au moins à la méthode 'onCompleted()' appelée dans ce cas. – santalu

+0

Encore une fois, puisque l'opérateur n'entend rien, il ne fera rien. L'observable fourni à votre fonction ne sera pas complet à moins que la source ne soit complète. –