在RxJava中合并具有独立且相等超时的两个流的正确方法

问题描述 投票:3回答:1

我想知道如何最好地结合两个流,每个流在RxJava中具有相同持续时间的独立超时,而不会导致崩溃的bug。

在RxJava中,如果运行以下代码,将导致崩溃异常:

val testObs = Single.fromCallable {
    Thread.sleep(10000)
}.subscribeOn(Schedulers.io())
        .timeout(5000L, TimeUnit.MILLISECONDS)
        .timeout(5000L, TimeUnit.MILLISECONDS)
        .test()

testObs.awaitTerminalEvent()

这是因为这两个timeouts都在computation线程computation上执行。超时之一将成功并关闭流,第二个超时将引发崩溃异常:

io.reactivex.exceptions.UndeliverableException:无法将异常传递给使用者,因为该异常已经取消/处理了该流,或者该异常无处可去。

显然,一个明显的解决方案是不将相同持续时间的两个超时附加到单个流。

但是,让我们想象一个简单的is or can be multi-threaded类,它定义了两个方法:

Api

在您的代码中,假设您有单独的 fun getNewMessages: Single<List<Messsage>> fun getUserProfileInfo: Single<Profile> ,每个都独立地调用这些方法;您也有一个Activity调用这两种方法,但使用StartupActivity合并了这些操作中的每一个,因此它实际上可以预取数据,并在调用[启动画面的Single.zip。这些方法中的每一个的实现都使用一个通用的网络类,该类应用30秒的标准Single.zip值。]

[不幸的是,如果出现网络问题,导致这两种方法都超出了默认的finish()值,则将所有这些网络操作组合在一起的.timeout将崩溃。

因此,是否存在一个推荐的模式,用于组合多个信号,每个信号都具有可能相等的独立超时值,因此会同时触发?如果我们采用“除非您是最终使用者,否则不增加超时”的方法,最终将在我们的代码中多次复制粘贴.timeout调用。

谢谢!

我想知道如何最好地组合两个流,每个流在RxJava中具有相同持续时间的独立超时,而不会导致崩溃错误。在RxJava中,如果运行以下代码,则......>

android timeout observable rx-java
1个回答
0
投票

Single.zip异常包装了:

java.util.concurrent.TimeoutException:源未发出信号事件持续了5000毫秒,并已终止

© www.soinside.com 2019 - 2024. All rights reserved.