2017-10-20 26 views
1

Je suis nouveau à RxJava. Mon expérience est principalement de ces tutoriels: Here, et here.RxJava: Sachez quand l'observation est terminée et renvoyez Boolean Observable à l'appelant

Maintenant, je me suis retrouvé dans une situation où j'ai appel API avec Retrofit2 qui retournera un Obesrvable<AccessToken>. Le client appellera ce service comme suit:

public Observable<TokenResult> authenticateWithClientCredentials() { 
     return authService.authenticate("client_credentials").take(1); 
} 

Lorsqu'une classe appelée Authenticator appellera #authenticateWithClientCredentials() du client.

Ce que je voudrais obtenir est de retourner un Observable<Boolean> de la classe Authenticator, une fois que l'appel d'API est terminée, à savoir l'intérieur onComplete() pour indiquer que le jeton d'accès a été récupéré et enregistré dans le cache à l'intérieur du succès classe Authenticator.

J'ai essayé l'opérateur defer mais je suis toujours perdu. approche

EDIT

Je sais que je peux passer un rappel dans les paramètres, mais n'est pas l'idée de Rx pour remplacer l'ancien callbacks classique?

Répondre

2

Si je comprends bien votre question, alors c'est ce que vous cherchez:

 

    client.authenticateWithClientCredentials() 
      .map(token -> { 
       // save `token` into cache 
       return token; 
      }) 
      .flatMap(integer -> Observable.just(Boolean.TRUE)) 
      .subscribe(aBoolean -> { 
       // success 
      }, throwable -> { 
       // error 
      }); 
 

Je ne sais pas exactement pourquoi vous voulez Observable<Boolean>, pouvant être complétée est beaucoup plus préféré dans ce cas, parce que soit le flux a complété avec succès ou non. Néanmoins, posté la solution en utilisant le type de retour Observable<Boolean>.

est ici l'approche Completable:

 

    client.authenticateWithClientCredentials() 
      .flatMapCompletable(integer -> { 
       // save `token` into cache 
       return Completable.complete(); 
      }) 
      .subscribe(() -> { 
       // success 
      }, throwable -> { 
       // error 
      }); 
 
+0

Merci pour la réponse, mais pas tout à fait ce que je voulais. #authenticateWithClientCredentials n'est pas une méthode de la classe Authenticator, c'est une méthode de la classe Client. L'Authenticator appellera authenticateWithClientCredentials et mettra en cache le jeton, après quoi je souhaite que l'Authenticator retourne un Observable pour indiquer que le jeton a été correctement défini dans le cache. –

+0

@MotassemJalal, mise à jour – azizbekian

+0

Pouvez-vous s'il vous plaît m'expliquer ce qui est (et pourquoi) Completable est plus préféré? –