Intereting Posts
Android Связать ссылки textColor проигнорирован, возможно переопределение CSS-кода? Android Tablet – получите уникальный идентификатор устройства Android Parcelable Реализация с ArrayList <Object> Android: Import DrawerLayout не может быть разрешен Запуск Intent.ACTION_VIEW не работает над сохраненным файлом изображения Украшение RecyclerView (с помощью GridLayoutManager) для отображения разделителя между элементами Документация по Android Studio для быстрой загрузки всегда «выборка документации» Локализация Android Просмотр пейджера с универсальным загрузчиком изображений Android RatingBar меняет цвет звезды Nexus 4 Формат предварительного просмотра камеры Соотношение всегда требует 16×9 поверхности? Зачем ACTION_CANCEL при касании Как получить «сетевое» время (из параметра «Автоматический» под названием «Использовать сетевые значения»), а не время на телефоне? Загрузите двоичный файл из OKHTTP Тост: Разница между «этим» и «getApplicationContext ()»?

Несколько запросов с модификацией для объединения результатов

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

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

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

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

Добавлено в 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

Solutions Collecting From Web of "Несколько запросов с модификацией для объединения результатов"

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

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

Мы используем RxJava в android и комбинируем результат. Я объяснил каждый шаг
Давайте сначала определим наш объект Retrofit для доступа к 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.

 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 на нашем новом объединенном Observable:

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