我正在使用改装(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
之后消失了
答案 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();
}