【问题标题】:Multiple requests with retrofit to combine results多个请求进行改造以组合结果
【发布时间】:2016-04-04 11:20:13
【问题描述】:

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

我猜应该在最后一个 api 完成返回响应后合并结果...

我该怎么做?

更新,根据 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 后,该错误就消失了

【问题讨论】:

  • 在改造中使用 RxJava
  • @MD 是 RxJava 使用改造的唯一方法吗?
  • @raklos 当然,您可以创建全局计数器并继续结果,当计数器变为零时(如果您在成功响应后递减它)但这很痛苦,RxJava 更安全、更酷、更容易
  • @AntonShkurenko 添加了更多代码

标签: android retrofit


【解决方案1】:

您可以使用 RxJava 并像这样组合结果:Combining API calls with RX Java

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

【讨论】:

  • 改造 1.9 是否与您建议的 SO 链接中使用的方法兼容?
  • 你检查过链接吗?
  • 是的,我都检查了,我尝试按照 SO 帖子中的建议实施。而在调试中就是不会进入onnext方法...
  • 现在更新了问题,我在onnext,call,onerror等中添加了断点,它似乎跳过了很多
  • @raklos onNext 没有被调用?
【解决方案2】:

使用 rxjava 2.X + Java 8 lambda:

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

像这样创建 Zip:

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

订阅组合 observable:

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

【讨论】:

  • 知道当应用程序进入后台并进入前台时该怎么办
猜你喜欢
  • 1970-01-01
  • 2015-09-24
  • 2018-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-31
相关资源
最近更新 更多