使用可互补的andThen运算符调用的RxJava2序列顺序

Ada*_*m J 5 stream sequence rx-java2

我正在尝试从RxJava1迁移到RxJava2.我更换所有的部分代码,我以前有Observable<Void>Compleatable.但是我遇到了一个流调用顺序的问题.当我以前处理Observables并使用map和flatMaps时,代码按预期工作.然而,andthen()运营商似乎有点不同.这是一个简化问题本身的示例代码.

public Single<String> getString() {
    Log.d("Starting flow..")
    return getCompletable().andThen(getSingle());
}

public Completable getCompletable() {
    Log.d("calling getCompletable");
    return Completable.create(e -> {
                Log.d("doing actuall completable work");
                e.onComplete();
            }
    );
}

public Single<String> getSingle() {
    Log.d("calling getSingle");
    if(conditionBasedOnActualCompletableWork) {
        return getSingleA();
    }else{
        return getSingleB();
    }
}
Run Code Online (Sandbox Code Playgroud)

我最后在日志中看到的是:

  1-> Log.d("Starting flow..")
  2-> Log.d("calling getCompletable");
  3-> Log.d("calling getSingle");
  4-> Log.d("doing actuall completable work");
Run Code Online (Sandbox Code Playgroud)

正如你可能想到的那样,我希望在第3行之前调用第4行(之后andthen()运算符的名称表明代码将在'Completable完成它的工作之后被调用').以前我是创造了Observable<Void>使用Async.toAsync()运营商和现在被称为该方法getSingle是在flatMap流-它的工作就像我预期,所以登录前4 3.现在我试图改变Compleatable的创建方式会出现-如使用fromActionfromCallable但它的行为相同.我也找不到任何其他操作员来替换andthen().要强调 - 该方法必须是可完成的,因为它没有任何意义完全返回的东西 - 它会更改应用程序首选项和其他设置(并且像全局主要使用'正常预期'那样使用)并且稍后需要这些更改在溪流中.我还尝试将getSingle()方法换行以某种方式创建一个Single并在create块中移动if语句,但我不知道如何在其中使用getSingleA/B()方法.我需要使用它们,因为它们有自己的复杂性,复制代码没有意义.任何人都知道如何在RxJava2中修改它,所以它的行为相同?在继续使用流之前,我依赖多个可依赖可完成作业的地方(如刷新会话令牌,更新数据库,首选项等等 - 使用flatMap在RxJava1中没有问题).

aka*_*okd 4

您可以使用延迟:

getCompletable().andThen(Single.defer(() -> getSingle()))
Run Code Online (Sandbox Code Playgroud)

这样,您不会getSingle()立即执行 的内容,而是仅在Completable完成并andThen切换到Single.