2015-10-07 1 views
3

J'ai un observable que je veux terminer si une certaine condition n'est pas remplie (c'est-à-dire si la réponse d'un certain site Web est infructueuse), de sorte que je puisse réinterroger le site Web, et appeler l'observable encore. Comment vais-je le faire?Comment mettre fin à un observable?

Voici ce que je veux faire:

Observable.create(new Observable.OnSubscribe<String>() { 
    @Override 
    public void call(Subscriber<? super String> subscriber) { 

     //Perform network actions here 

     if (!response.isSuccessful()) { 
      //terminate this Observable so I can retrieve the token and call this observable again 
     } 
    } 

}); 
+1

Pourriez-vous s'il vous plaît donner des détails sur "mettre fin à la Observable"? Voulez-vous dire que vous voulez contenir toute la logique de re-connexion à l'intérieur de l'observable? Souhaitez-vous que vos abonnés en aval reçoivent un événement lorsque vous y mettez fin afin qu'ils puissent se réabonner ou voulez-vous simplement le faire pour eux sans leur intervention? – Aaron

Répondre

0

Vous pouvez filtrer le résultat avant de souscrire. Ne le manipulez pas lorsque vous créez votre observable.

fonction Vérifier observable.filter

+0

C'est un opérateur utile. Mais que faire si ça ne passe pas par le filtre? L'observable s'arrête-t-il simplement? Parce que je ne veux pas continuer avec la logique qui suit ma boucle if. Comment ferais-je avec un filtre? Devrais-je avoir le résultat de la boucle if comme vérification de filtre? Et si c'est faux, alors quoi? –

+0

Cela empêchera la chaîne de la fonction de filtre d'émettre plus d'éléments (en d'autres termes, oui, votre méthode d'abonnement ne sera pas appelée) – Richard

6

Vous pouvez utiliser l'opérateur retry de Rx. Et ne doit pas mettre fin à un Observable.

une exception Defined personnalisée:

public class FailedException extends RuntimeException{ 
    // ... 
} 


private static final int RETRY_COUNT = 3; // max retry counts 
Observable.create(new Observable.OnSubscribe<String>() { 
     @Override 
     public void call(Subscriber<? super String> subscriber) { 
      //Perform network actions here 
      if (!response.isSuccessful()) { 
       // if response is unsucceed, invoke onError method and it will be stop emit data and into retry method. 
       subscriber.onError(new FailedException()); 
      } 
     } 

    }) 
    .retry((integer, throwable) -> { 
     // Retry network actions when failed. 
     // if return true, Observable will be retry to network actions emit data; 
     // if return false, you can process in onError() method of Subscribe. 
     return throwable instanceof FailedException && integer < RETRY_COUNT; 
    })