android - 使用 RX-Java 进行相关操作和 http 请求

标签 android rx-java

我尝试在 Android 上使用 rx-java 执行几个连续的 http 请求,每个请求都依赖于前一个请求的响应。 这不太适合 map()/doFinall() 模型,因此我不确定在不进入“回调 hell ”以及编写简洁代码的情况下执行此操作的最佳方法是什么。

更具体地说:

  1. 执行http GET“/x”
  2. 如果 (2) 成功,则执行 http GET "/y"
  3. 对GET/y的结果进行计算

关于如何解决这个问题有什么建议吗?

最佳答案

我认为 flatMap 就是您正在寻找的。例如,假设您有以下方法:

Observable<Foo> getFoo();
Observable<Bar> getBar(Foo foo); //needs a Foo first

您可以通过这种方式有效地链接它们:

getFoo().flatMap(new Func1<Foo, Observable<Bar>>() {
    @Override
    public Observable<Bar> call(Foo foo) {
        return getBar(foo);
    }
});

然后,您可以通过订阅结果 Observable<Bar> 对最终结果 Bar 执行一些计算(为了清楚起见,显示了完整的示例):

getFoo().flatMap(new Func1<Foo, Observable<Bar>>() {
    @Override
    public Observable<Bar> call(Foo foo) {
        return getBar(foo);
    }
}).subscribe(new Action1<Bar>() {
    @Override
    public void call(Bar bar) {
        //everything succeeded, so perform calculation to the Bar
    }
}, new Action1<Throwable>() {
    @Override
    public void call(Throwable throwable) {
        //handle an error that occurred anywhere in the chain      
    }
});

请注意,获取 Foo 或 Bar 过程中的任何错误都将由我们在订阅 Observable 时提供的 Action1 处理。当然,由于 Java 的原因,它冗长得令人痛苦,但至少它避免了嵌套 Observables/回调 hell 。

关于android - 使用 RX-Java 进行相关操作和 http 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19988224/

相关文章:

android - KXmlParser 在 RSS 传递开始时抛出 "Unexpected token"异常

android - 为什么 AudioManager.isStreamMuted 不可用?

java - 执行 Observables 映射

java - RxJava 将 Observable 与另一个可选的具有超时功能的 Observable 结合起来

rx-java - Scala.js Observables 查询

java - 可观察超时

java - Android - AsyncTask 返回值

java - 使用 ButterKnife 处理自定义 AlertDialog 时出现异常

c# - $(TargetFrameworkVersion) (v9.0) 小于 Xamarin.Forms (10.0) 所需的最低 $(TargetFrameworkVersion)

java - RxJava 队列多观察