web-dev-qa-db-fra.com

Plusieurs demandes avec rattrapage pour combiner les résultats

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.

12
raklos

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/

4
Anton Shkurenko

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();
}
1
SANAT