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

时间:2015-03-19 09:27:48

标签: android retrofit rx-java

我正在使用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();
    }
  });

fetchToDoListsfetchToDos是Retrofit Web服务调用,返回BcxToDoListBcxToDos Observables。

在订阅fetchToDoLists时,我遍历每个BcxToDoList,调用fetchToDos并将我的BcxToDo对象附加到原始列表。

正如你所看到的,它有点冗长。我可以将它分成两个语句,使其更具可读性。但是,这不是很好的Rx。在RxJava中有不同的方法来提高它的可读性吗?

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

1 个答案:

答案 0 :(得分:1)

你不应该打破链条#34;在你的RxJava调用中,因此你需要flatMap来链接它们。 Observable.from()允许您将元素列表拆分为单独的Observable。接下来,您可以使用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(...);