具有改进的多个请求以组合结果

时间:2016-04-04 11:20:13

标签: android retrofit

我正在使用改装(1.9)并试图找出我如何调用2 apis并合并结果。

我猜结果应该在最后一个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时,我遇到了一些错误,在gradle文件中multiDexEnabled true之后消失了

2 个答案:

答案 0 :(得分:4)

您可以使用RxJava并结合如下结果:Combining API calls with RX Java

这是教程,如何使用RxJava和Retrofit 1.9 http://randomdotnext.com/retrofit-rxjava/

答案 1 :(得分:1)

使用rxjava 2.X + Java 8 lambda:

使用与Ramkailash的答案相同的Observable。

像这样创建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
}

在不需要时处理一次性用品

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