使用RxJava嵌套网络请求

时间:2017-09-08 08:53:36

标签: java android android-asynctask observable rx-java2

我对RxJava很新。我将嵌套的异步操作转换为RxJava结构时遇到问题。从服务器获取数据的单个异步任务不是一个需要创建的问题,但是我确实遇到了这种示例性案例的问题:

List<A> aaa = new ArrayList<>();
List<B> bbb = new ArrayList<>();

new FetchItemA(String id){
   @Override
   protected void onPostExecute(List<A> items){
      foreach(A item:items){
          new FetchItemB(item.getId())
              @Override
              protected void onPostExecute(List<B> newItems){
                 neededList.addAll(newItems);
              }
          }
      }
  }

}

问题在于返回类型。我用这种方式创造了我的观察力:

Observable.fromArray(String userId)
      .map(new Function(String, List<A>){
          @Override
          public List<A> apply(String id){
             return getListA();
          }
      })
      .map(new Function<String, List<B>){
          @Override
          public List<B> apply(String id){
              someList.add(getItemB(id));
              return someList;
          }
      })
      .observeOn(AndroidSchedulers.mainThread())
      .subscribe(new Observer(){
            @Override
            public void onCompleted(List<B> items){
               bbb.addAll(items);
               adapter.setItems(bbb);
            }
      });

然而,这是非法的,因为Observable期望类型为List<A>而我返回List<B>。如何构造我的RxJava observable以便能够获取项目列表(类型A,每个都具有唯一的id),并基于获取的列表,获取具有id(每个项目)的单个项目(类型B)在第一个列表中的类型A)作为参数,并且只有在将收到的项目(类型B)添加到列表中之后?

1 个答案:

答案 0 :(得分:0)

获取数据的关键步骤是使用网络调用将每个B转换为flatMap()。在RxJava世界中,这意味着将网络调用包装在一个observable中,然后使用Observable.fromList(aaa) .flatMap(new Func1<A, Observable<B>>() { @Override public Observable<B> call(A a) { return Observable.fromCallable(getNetworkValueAsB(item)); } } ) .toList() .subscribe( new Observer<List<B>>() { @Override public void onNext(B bItemList) { bbb.addAll(bItemList); adapter.setItems(bbb); } }); 运算符。

fromList()

操作为List<A>,可使用此调用从Observable<A>转换为flatMap()AB转换为toList(),和B收集生成到列表中的所有fromList()值,然后在订阅中使用。

fromIterable()运算符可能会被称为from()canvas.creat_image,具体取决于您使用的库的版本。

编辑删除了lambdas