Множественные запросы с retrofit для того чтобы совместить результаты

Im с помощью retrofit (1.9) и пытается выяснить, как я могу вызвать 2 API и объединить результаты.

Я думаю, что результаты должны быть объединены, когда последний api закончил возвращать ответ...

как я могу это сделать?

Udpate, в соответствии с ответом Antons я попробовал следующее:

добавлено в gradle:

  compile 'io.reactivex:rxjava:1.0.+'
    compile 'io.reactivex:rxandroid:0.23.+'

интерфейс 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);

фрагмент

     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);
                }
            });

одна вещь, возможно, стоит отметить, когда я добавил RxJava для gradle я получал некоторую ошибку, которая ушла после того, как я сделал multiDexEnabled true в файле gradle

3 ответов


вы можете использовать RxJava и комбинировать результаты следующим образом: объединение вызовов API с RX Java

вот учебник, как использовать RxJava и Retrofit 1.9: http://randomdotnext.com/retrofit-rxjava/


мы используем RxJava в android и комбинируем результат. Я объяснил каждый шаг
Давайте сначала определим наш модифицированный объект для доступа к API Github, а затем установим два наблюдаемых для двух сетевых запросов выше:

Retrofit repo = new Retrofit.Builder()
        .baseUrl("https://api.github.com")
        .addConverterFactory(GsonConverterFactory.create())
        .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
        .build();

Observable<JsonObject> userObservable = repo
        .create(GitHubUser.class)
        .getUser(loginName)
        .subscribeOn(Schedulers.newThread())
        .observeOn(AndroidSchedulers.mainThread());

Observable<JsonArray> eventsObservable = repo
        .create(GitHubEvents.class)
        .listEvents(loginName)
        .subscribeOn(Schedulers.newThread())
        .observeOn(AndroidSchedulers.mainThread());

интерфейсы Retrofit достаточно просты:

public interface GitHubUser {
  @GET("users/{user}")
  Observable<JsonObject> getUser(@Path("user") String user);
}

public interface GitHubEvents {
  @GET("users/{user}/events")
  Observable<JsonArray> listEvents(@Path("user") String user);
}

в последнее время мы используем zip-метод RxJava для объединения наших двух наблюдаемых и ждем их завершения перед созданием нового Заметный.

Observable<UserAndEvents> combined = Observable.zip(userObservable, eventsObservable, new Func2<JsonObject, JsonArray, UserAndEvents>() {
  @Override
  public UserAndEvents call(JsonObject jsonObject, JsonArray jsonElements) {
    return new UserAndEvents(jsonObject, jsonElements);
  }
});

что такое UserAndEvents? Это простой POJO, чтобы объединить два объекта:

public class UserAndEvents {
  public UserAndEvents(JsonObject user, JsonArray events) {
    this.events = events;
    this.user = user;
  }

  public JsonArray events;
  public JsonObject user;
}

наконец, давайте вызовем метод subscribe на нашем новом комбинированном наблюдаемом:

combined.subscribe(new Subscriber<UserAndEvents>() {
          ...
          @Override
          public void onNext(UserAndEvents o) {
            // You can access the results of the 
            // two observabes via the POJO now
          }
        });

использование rxjava 2.X + Java 8 лямбда:

используйте наблюдаемые же, как ответ Рамкайлаша.

создать Zip, как это:

Observable<UserAndEvents> combined = Observable.zip(userObservable, eventsObservable, (jsonObject, jsonArray) -> new UserAndEvents(jsonObject, jsonArray));

подписаться комбинированный наблюдаемый:

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
}

Dispose устранимый когда не нужно:

@Override
public void onStop() {
    super.onStop();
    if (disposable != null) disposable.dispose();
}