【问题标题】:Composing observables in RxJava Android在 RxJava Android 中编写 observables
【发布时间】:2014-12-13 00:12:39
【问题描述】:

我一直在调整我的 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 的回调中订阅它?这就是我现在正在做的事情,它有效,但我想知道是否有更优雅、更适合反应的方式来构建我的请求。

【问题讨论】:

    标签: android


    【解决方案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)

    【讨论】:

    • 完美,谢谢。我曾尝试过平面地图,但在尝试正确链接它们时一定犯了一些错误。您的示例有效,正是我想要的。
    猜你喜欢
    • 1970-01-01
    • 2019-08-13
    • 2017-09-07
    • 2018-05-05
    • 1970-01-01
    • 2014-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多