【问题标题】:RxJava2 order of sequence called with compleatable andThen operatorRxJava2 使用可编译的 andThen 运算符调用的序列顺序
【发布时间】: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&lt;Void&gt;,现在称为getSingle 的方法在flatMap 流中-它的工作方式与我预期的一样,因此日志4 会出现在3 之前。现在我尝试了改变 Compleatable 的创建方式 - 就像使用 fromActionfromCallable 但它的行为相同。我也找不到任何其他运算符来替换andthen()。强调一下 - 该方法必须是 Completable ,因为它没有任何完全返回的含义 - 它会更改应用程序首选项和其他设置(并且在全球范围内使用,主要是“按预期”工作)并且以后需要这些更改在溪流中。我还尝试包装 getSingle() 方法以某种方式创建一个 Single 并将 if 语句移动到 create 块内,但我不知道如何在其中使用 getSingleA/B() 方法。我需要使用它们,因为它们有自己的复杂性,复制代码没有意义。任何人都知道如何在 RxJava2 中修改它以使其行为相同?在继续使用流之前,我在多个地方依赖 Compleatable 作业来完成(例如刷新会话令牌、更新数据库、首选项等 - 在使用 flatMap 的 RxJava1 中没有问题)。

【问题讨论】:

  • 您知道调用getSingle() 会立即执行,而不是在getCompletable 返回的Completable 完成后执行吗?

标签: stream sequence rx-java2


【解决方案1】:

你可以使用defer:

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

这样,您不会立即执行getSingle() 的内容,而只会在Completable完成和andThen 切换到Single 时执行。

【讨论】:

  • 感谢您的提示,我将答案标记为有帮助 - 它确实解决了问题。尽管我必须说它看起来确实是一种解决方法。我仍然很困惑为什么行为改变与 RxJava1 版本相比,我使用 flatMap 并且回调按照我期望的顺序进行。在 RxJava2 文档的“新功能”部分中没有找到任何有关它的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-28
  • 1970-01-01
  • 1970-01-01
  • 2017-04-17
  • 2016-01-24
相关资源
最近更新 更多