【发布时间】:2017-04-01 13:23:38
【问题描述】:
我正在尝试从 RxJava1 迁移到 RxJava2。我正在将以前 Observable<Void> 的所有代码部分替换为 Compleatable。但是,我遇到了流调用顺序的一个问题。当我之前处理 Observables 并使用地图和 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”完成它的工作后调用)。以前我使用Async.toAsync() 运算符创建Observable<Void>,现在称为getSingle 的方法在flatMap 流中-它的工作方式与我预期的一样,因此日志4 会出现在3 之前。现在我尝试了改变 Compleatable 的创建方式 - 就像使用 fromAction 或 fromCallable 但它的行为相同。我也找不到任何其他运算符来替换andthen()。强调一下 - 该方法必须是 Completable ,因为它没有任何完全返回的含义 - 它会更改应用程序首选项和其他设置(并且在全球范围内使用,主要是“按预期”工作)并且以后需要这些更改在溪流中。我还尝试包装 getSingle() 方法以某种方式创建一个 Single 并将 if 语句移动到 create 块内,但我不知道如何在其中使用 getSingleA/B() 方法。我需要使用它们,因为它们有自己的复杂性,复制代码没有意义。任何人都知道如何在 RxJava2 中修改它以使其行为相同?在继续使用流之前,我在多个地方依赖 Compleatable 作业来完成(例如刷新会话令牌、更新数据库、首选项等 - 在使用 flatMap 的 RxJava1 中没有问题)。
【问题讨论】:
-
您知道调用
getSingle()会立即执行,而不是在getCompletable返回的Completable完成后执行吗?