使用RX-Java进行依赖操作和http请求

时间:2013-11-14 20:57:48

标签: android rx-java

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

更具体地说:

  1. 做http GET“/ x”
  2. 如果(2)成功,
  3. 执行http GET“/ y”
  4. 对GET / y的结果进行计算
  5. 有关如何解决这个问题的任何建议吗?

1 个答案:

答案 0 :(得分:4)

我认为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 / callback地狱。