Множественные запросы с 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();
}