2017-09-17 15 views
0

Je veux appeler plusieurs Api de repos dans une séquence et chaque Dto de réponse est différent l'un de l'autre.Rx Java Android Doit appeler plusieurs API dans une séquence et sauvegarder chaque résultat.

S'il vous plaît aidez-moi à se débarrasser de cette situation que, Comment puis-je appeler ces Api utilisant Rx Java Observables dans Android.

+0

vous pouvez utiliser l'opérateur concat qui prend plusieurs Observables et concaténer leurs séquences – Payal

+0

Merci, Cette solution est utile pour moi. –

Répondre

0

Pour le même scénario, j'utiliser l'opérateur de concat qui prend plusieurs Observables et concaténer leur séquence

Si la séquence de réponse ne nécessite pas alors vous pouvez utiliser l'opérateur de fusion aussi.

Concat VS Merge operaror

0

essayer doOnNext() ou map() méthode de Observable et utiliser la synchronisation execute() de chaque réponse et les transmettre plus

+0

Pouvez-vous expliquer, pourquoi ne pas utiliser '' 'doOnNext()' '' ou '' 'map()' '' '? Parce que je n'ai pas d'autres options sans '' 'doOnNext()' '' dans Retrofit avec Java Rx dans Android par exemple '' 'api.uploadImage (pref.getAuthToken(), capture d'écran)' '' après que '' 'execute() '' 'n'apparaît dans aucune option après l'opérateur point. –

+0

la réponse est devenue plutôt grande pour le commentaire, j'ai donné une réponse complète dans le fil –

1

non, vous devez utiliser map() ou doOnNext(), il ressemblera à ceci

Observable.just(1) 
    .doOnNext(value -> { 
     someRequestX().execute();  
    }) 
    .map(value -> { 
     return nextRequestY().execute();  
    }) 
    .doOnNext(requestYResponse-> { 
     someRequesZ(requestYResponse.someValue).execute();  
    }) 
    .map(requestYResponse-> { 
     return someRequesK(requestYResponse.someValue).execute();  
    }) 
    .map(requestKResponse -> { 
     return someRequesJ(requestKResponse.someValue).execute();  
    }) 
    .subscribe(requestJResponse -> { 
     doSOmethingWithFinalResponse(requestJResponse); 
    }) 
0

Tout d'abord, pour les demandes de réseau est préférable d'utiliser Single puis Observable, bec ause il y aura toujours un seul article. Pour passer d'une requête à l'autre, vous pouvez utiliser flatMap.

Si l'on suppose que votre code est similaire, vous pouvez essayer:

class Dto1 {} 

class Dto2 {} 

class Dto3 {} 

public interface Api { 

    Single<Dto1> getDto1(); 

    Single<Dto2> getDto2(); 

    Single<Dto3> getDto3(); 
} 

private Api api; 

public void callApi() { 
    api.getDto1() 
      .doOnSuccess(dto1 -> {/*do something with dto1*/}) 
      .flatMap(dto1 -> api.getDto2()) 
      .doOnSuccess(dto2 -> {/*do something with dto2*/}) 
      .flatMap(dto2 -> api.getDto3()) 
      .doOnSuccess(dto3 -> {/*do something with dto3*/}) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe() 
}