我正在尝试从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的创建方式 - 比如使用fromAction
或fromCallable
,但它的行为相同。我也找不到任何其他运算符来替换andthen()
。要强调 - 该方法必须是可完成的,因为它没有任何意义完全返回的东西 - 它会更改应用程序首选项和其他设置(并且像全局主要使用'正常预期'那样使用)并且稍后需要这些更改在溪流中。我还尝试用getSingle()
方法包装以某种方式创建一个Single并在create块中移动if语句,但我不知道如何在其中使用getSingleA / B()方法。我需要使用它们,因为它们有自己的复杂性,复制代码没有意义。任何人都知道如何在RxJava2中修改它,所以它的行为相同?在继续使用流之前,我依赖多个可依赖可完成作业的地方(如刷新会话令牌,更新数据库,首选项等等 - 使用flatMap在RxJava1中没有问题)。
答案 0 :(得分:1)
您可以使用延期:
getCompletable().andThen(Single.defer(() -> getSingle()))
这样,您就不会立即执行getSingle()
的内容,但只有在Completable
完成且andThen
切换到Single
时才会执行。{/ p >