RxJava 使用 zip 链接多个调用

The*_*dge 5 android rx-java

我正在尝试从一系列 API 调用中构建一个 observable,但我无法让它工作。我有什么为四个API调用ApiAApiBApiCApiD使用该回报可观测量RxJavaCallAdapterFactoryApiA并且ApiB必须先调用,然后在两者都执行后调用 ApiC 和 ApiD 。执行完最后两个之后,视图被初始化。我正在使用 zip 运算符来等待呼叫完成,我不确定这是要走的路,但我很新,RxJava所以如果有另一种更好的方法来做到这一点,请告诉我。下面是我的代码,注释显示了我卡住的地方

public Observable syncData() {
    return Observable.zip(
        // these two calls are executed
        callApiA(),
        callApiB(),
        (o, o2) -> Observable.zip(
            /* these two calls are not executed, it seems as if this zip has 
            no subscriber but i don't know why ... */
            callApiC(),
            callApiD(),
            (o, o2) -> {
                someLogic();
                return Observable.empty();
            }));
}
Run Code Online (Sandbox Code Playgroud)

鉴于我只是订阅了这种方法

viewModel.syncData().subscribe(
            o -> mainAdapter.update(),
            throwable -> throwable.printStackTrace()
);
Run Code Online (Sandbox Code Playgroud)

再次,我对 RxJava 相当陌生,因此任何帮助将不胜感激。谢谢

R. *_*ski 4

你走在正确的轨道上。

但是,请注意,.zip最后一个参数Func不是Observable<R>从其call函数返回,而是R直接返回。

所以你回到的ObservableSubscriber'sonNext而不是它的事件。

flatMap之间需要:

Observable.zip(callApi1(), callApi2(), Pair::new)
     .flatMap((pair) -> Observable.zip(
           Observable.just(pair.first()),
           Observable.just(pair.second()),
           callApiC(),
           callApiD(),
           (t1, t2, t3, t4) -> {
                 someLogic()
           }));
Run Code Online (Sandbox Code Playgroud)

这是伪代码,但我希望你明白:

  1. Zip前 2 个调用(A、B)
  2. 返回Pair从这些函数返回的对象
  3. Pair使用运算符进行变换zip(使用flatMap运算符)
  4. 将此Pair与接下来的 2 个调用 (C,D)结合起来
  5. 从函数返回组合对象someLogic()(记住,someLogic应该返回R而不是Observable<R>

未来提示: 首先尝试在不使用 lambda 表达式的情况下编写它。然后就可以看到输入输出参数,这样写代码就更容易了。然后用 lambda 表达式重写相同的内容。