J'utilise retrofit (1.9) et essaie de comprendre comment je peux appeler deux apis et fusionner les résultats.
Je suppose que les résultats devraient être fusionnés lorsque la dernière API aura fini de renvoyer une réponse ...
Comment puis-je faire ceci?
Udpate, selon Antons répond que j'ai essayé ce qui suit:
ajouté à gradle:
compile 'io.reactivex:rxjava:1.0.+'
compile 'io.reactivex:rxandroid:0.23.+'
Interface Api
@GET("/maps/api/place/details/json")
Observable<PlaceDetailResult1> getPlacesFrom1( @Query("key") String key, @Query("placeid") String placeid);
@GET("api/places/{id}/ratings")
Observable<PlaceDetailResult2> getPlacesFrom2(@Path("id") String id);
En fragment
IPlaces api = adapter.create(IPlaces.class); //endpoint1
IPlaces api2 = adapter2.create(IPlaces.class); //endpoint2
Observable.combineLatest(
api.getPlacesFrom1("key", placeId),
api2.getPlacesFrom2(placeId),
new Func2<PlaceDetailResult1, PlaceDetailResult2, MergedReviews>() {
@Override
public MergedReviews call(PlaceDetailResult placeDetailResult1, PlaceDetailResult2 placeDetailResult2) {
// processToMerge( placeDetailResult1, placeDetailResult2)
return mr;
}
})
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<MergedReviews>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(MergedReviews mr) {
SetAdapter(mr.reviews);
SetPhotosAdapter(mr.photos);
}
});
Une chose qui mérite peut-être d’être soulignée: lorsque j’ai ajouté RxJava à Gradle, j’obtenais une erreur qui disparaissait après avoir fait multiDexEnabled true
dans le fichier Gradle.
Vous pouvez utiliser RxJava et combiner des résultats comme ceci: Combinaison d'appels d'API avec RX Java
Voici comment utiliser RxJava et Retrofit 1.9: http://randomdotnext.com/retrofit-rxjava/
Utilisation de rxjava 2.X + Java 8 lambda:
Utilisez Observables comme dans la réponse de Ramkailash.
Créer un fichier Zip comme ceci:
Observable<UserAndEvents> combined = Observable.Zip(userObservable, eventsObservable, (jsonObject, jsonArray) -> new UserAndEvents(jsonObject, jsonArray));
Souscrire combiné observable:
Disposable disposable = combined.subscribe(this::successUserAndEvents,this::throwableError);
private void successUserAndEvents(UserAndEvents o) {
// You can access the results of the
// two observabes via the POJO now
}
private void throwableError(Throwable throwable){
// handle throwable
}
Éliminer jetable lorsqu'il n'est pas nécessaire:
@Override
public void onStop() {
super.onStop();
if (disposable != null) disposable.dispose();
}