【问题标题】:RxJava - Combine two ObservablesRxJava - 结合两个 Observable
【发布时间】:2016-09-06 02:41:14
【问题描述】:

我需要将来自另一个改造请求的图像合并到其特定系列。 听起来很简单的任务却把我带进了毫无希望的反应地狱。

具体来说,我还通过 Observable 创建服务,因为我需要获取身份验证令牌来创建服务。

我的尝试基于这个答案:https://stackoverflow.com/a/28418503/2192545

public void loadSeries(String searchFor) {

    mainView.showLoadingIndicator();
    if (subscription != null) subscription.unsubscribe();


    TVApplication application = TVApplication .get(mainView.getContext());

    application.getTVService()
            .flatMap(service -> service.searchSeries(searchFor)
                    .flatMap(series -> Arrays.asList(series).stream()
                            .<List<Series>>flatMap(aSeries -> {
                                Observable<Series> obsSeries = Observable.just(aSeries);
                                Observable<ImageListWrapper> obsImages = service.queryImages(aSeries.getId(), "poster");
                                return Observable.zip(obsSeries, obsImages, (Series s, ImageListWrapper i) -> combineSeriesData(s, i));
                            })));
}

private Series combineSeriesData(Series s, ImageListWrapper i) {
    s.setPosters(i.getImages());
    return s;
}

我有点过头了。我只是在 IDE 的 Observable.zip 的 Func2 部分得到“无法推断功能接口类型”,构建日志说:

Error:(63, 58) error: incompatible types: bad return type in lambda 

expression
no instance(s) of type variable(s) T1,T2,R exist so that Observable<R> conforms to Stream<? extends List<Series>>
where T1,T2,R are type-variables:
T1 extends Object declared in method <T1,T2,R>zip(Observable<? extends T1>,Observable<? extends T2>,Func2<? super T1,? super T2,? extends R>)
T2 extends Object declared in method <T1,T2,R>zip(Observable<? extends T1>,Observable<? extends T2>,Func2<? super T1,? super T2,? extends R>)
R extends Object declared in method <T1,T2,R>zip(Observable<? extends T1>,Observable<? extends T2>,Func2<? super T1,? super T2,? extends R>)

【问题讨论】:

    标签: java android retrofit rx-java rx-android


    【解决方案1】:

    好的,第一件事;不要将服务创建为可观察对象,这会使您的代码更难。有办法解决这个问题。

    其次,你不需要使用zip:

    application
      .getTVService()
      .flatMap(service ->
         service
         .searchSeries(searchFor)
         .flatMapIterable(series -> series)
         .flatMap(aSeries -> 
            service
            .queryImages(aSeries.getId(), "poster")
            .map(i ->  combineSeriesData(aSeries, i))
         )
      );
    

    【讨论】:

      猜你喜欢
      • 2016-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多