在RxJava Android中编写可观察对象

时间:2014-12-09 18:56:19

标签: android

我一直在调整我的Android应用程序以使用RxJava,但我在这方面遇到了一些麻烦。正如我在上一篇文章(Wait for all requests in Android Volley)中所建议的那样,我使用Observables来模仿我在JavaScript中与REST API的接口方式。具体来说,使用promise库,我会编写如下调用:

$q.all([
   fetchResourceA(),
   fetchResourceB()
])
  .then(function (responses) {
     ...
     return fetchResourceC();
  })
  .then(function (response) {
     ...
  });

在此示例中,我同时查询两个资源,收集结果,然后根据先前收集的资源中的一些参数收集第三个资源。在RxJava中我能够做到的最好的模仿是这样的:

Observable o = Observable.zip(
   fetchResourceA(),
   fetchResourceB(),
   new Func2<ResA, ResB, Object>() {
      @Override
      public Object call(ResA resA, ResB resB) {
         ...
      }
   }
);

但我正在努力像在JavaScript中那样构建它们。我是否需要简单地创建第二个observable并在zip的回调中订阅它?这就是我现在正在做的事情,并且它有效,但我想知道是否有更优雅,更具反应性的方式来构建我的请求。

1 个答案:

答案 0 :(得分:1)

来自promise的.then方法可以转换为RxJava中的flatMap方法

那么,您可以做的是zip然后flatMap然后flatMap

Observable.zip(fetchA(), fetchB(), (a, b) -> new Response(a, b))
          .flatMap((responses) -> fetchC())
          .flatMap((cResponse) -> /* whatever */)
          .subscribe();

请注意,fetchA()fetchB()fetchC()会返回Observables。

(我的例子是为了清晰起见使用lambdas)