Android RxJava-组合多个/不同的web服务调用

Android RxJava-组合多个/不同的web服务调用,android,retrofit,rx-java,Android,Retrofit,Rx Java,我正在使用Basecamp api返回并显示待办事项列表。下面是我目前正在做的一个示例: bcxClient .fetchToDoLists() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<List<BcxToDoList>>() { @Override public void call(Lis

我正在使用Basecamp api返回并显示待办事项列表。下面是我目前正在做的一个示例:

bcxClient
  .fetchToDoLists()
  .subscribeOn(Schedulers.io())
  .observeOn(AndroidSchedulers.mainThread())
  .subscribe(new Action1<List<BcxToDoList>>() {
    @Override
    public void call(List<BcxToDoList> bcxToDoLists) {

      for( final BcxToDoList toDoList : bcxToDoLists ) {
        bcxClient
          .fetchToDos( toDoList.bucket.id )
          .subscribeOn( Schedulers.io() )
          .observeOn( AndroidSchedulers.mainThread() )
          .subscribe( new Action1<List<BcxToDo>>() {
            @Override
            public void call(List<BcxToDo> bcxToDos) {
              for( BcxToDo toDo : bcxToDos ) {
                toDoList.toDos.add( toDo );
              }
            }
          }, new Action1<Throwable>() {
            @Override
            public void call(Throwable throwable) {
              throwable.printStackTrace();
            }
          });
      }

      mLoremTextView.setText(bcxToDoLists.get(0).name);
    }

  }, new Action1<Throwable>() {
    @Override
    public void call(Throwable throwable) {
      throwable.printStackTrace();
    }
  });
bcxClient
.fetchtopolists()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.订阅(新操作1(){
@凌驾
公共作废调用(列表bcxToDoLists){
对于(最终BcxToDoList toDoList:BcxToDoList){
bcxClient
.fetchToDos(toDoList.bucket.id)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.订阅(新操作1(){
@凌驾
公共作废调用(列表bcxToDos){
for(BcxToDo toDo:bcxToDos){
toDoList.toDos.add(toDo);
}
}
},新行动1(){
@凌驾
公共无效呼叫(可丢弃可丢弃){
printStackTrace();
}
});
}
mLoremTextView.setText(bcxToDoLists.get(0.name));
}
},新行动1(){
@凌驾
公共无效呼叫(可丢弃可丢弃){
printStackTrace();
}
});
fetchToDoLists
fetchToDos
是更新的web服务调用,它们返回
BcxToDoList
BcxToDos
可见值

在订阅
fetchToDos
I循环浏览每个BcxToDoList时,调用
fetchToDos
并将我的BcxToDo对象附加到原始列表

正如你所看到的,这有点冗长。我可以把它分成两条语句,让它更具可读性。但是,这不是很好。在RxJava中是否有不同的方法来实现这一点并提高其可读性

我可以使用lambdas来实现这一点,但在这个阶段,我更感兴趣的是我可以利用RxJava中的哪些功能。

您不应该在RxJava调用中“断链”,因此您需要flatMap来链接它们。还可以使用Observable.from()将元素列表拆分为单独的可观察对象。接下来,您可以使用toList将元素返回到列表中。下面是一个例子:

bcxClient
        .fetchToDoLists()
        .flatMap(new Func1<List<BcxToDoList>, Observable<BcxToDoList>>() {
            @Override
            public Observable<BcxToDoList> call(List<BcxToDoList> bcxToDoLists) {
                return Observable.from(bcxToDoLists);
            }
        })
        .flatMap(new Func1<BcxToDoList, Observable<List<BcxToDo>>>() {
            @Override
            public Observable<List<BcxToDo>> call(BcxToDoList bcxToDoList) {
                return bcxClient
                        .fetchToDos(bcxToDoList.bucket.id);
                        .map(new Func1<List<BcxToDo>, BcxToDoList>() {
                            @Override
                            public BcxToDoList call(List<BcxToDo> bcxToDos) {
                                bcxToDoList.toDos.addAll(bcxToDos);
                                return bcxToDoList;
                            }
                        });
            }
        })
        .toList()
        .subscribe(...);
bcxClient
.fetchtopolists()
.flatMap(新函数1(){
@凌驾
公共可观察呼叫(列表BCxToDoList){
可观察的返回(BCxToDoList);
}
})
.flatMap(新函数1(){
@凌驾
公共可观察呼叫(BcxToDoList BcxToDoList){
返回bcxClient
.fetchToDos(bcxToDoList.bucket.id);
.map(新函数1(){
@凌驾
公共bcxToDos调用(列表bcxToDos){
bcxToDoList.toDos.addAll(bcxToDos);
返回bcxtodolost;
}
});
}
})
托利斯先生()
.认购(……);

我是个新手,所以我真的帮不了你,但我想我会问-这对你有帮助吗?看到平面图是如何工作的帮助!对于bcxToDoList中的每个项目,我必须调用
fetchToDos
(带有参数)。然后如何将每个bcxToDo添加到它们的相关bcxToDo列表中?我已经通过添加请求参数编辑了我的答案。我还删除了将列表拆分为单独的元素,但请仔细查看fetchToDos映射-我正在将响应映射到当前BcxToDoList,但也添加了已获取的列表