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

时间:2017-04-01 13:23:38

标签: 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();
    }
}

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

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

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

1 个答案:

答案 0 :(得分:1)

您可以使用延期:

getCompletable().andThen(Single.defer(() -> getSingle()))

这样,您就不会立即执行getSingle()的内容,但只有在Completable完成且andThen切换到Single时才会执行。{/ p >