0

我有这个 Android Kotlin 代码,其中包含一个 Completables 列表,这些 Completables 合并成一个更大的mergeDelayError(),有一个超时。达到超时时,我得到java.util.concurrent.TimeoutException: The source did not signal an event for 250 milliseconds and has been terminated.

我如何知道列表中的哪一个小可完成项在没有发出任何信号/发出任何信号的情况下达到了超时(实际列表有两个以上的 BTW)。我理想的解决方案是将此类异常替换为:Exception: The following operations reached a timeout: Check initial settings, Check server,或者至少每个超时可完成打印输出的特定日志行。

我不知道该怎么做。我的第一个猜测是简单地为每个可完成添加一个“didEmit”标志,并在大可完成上达到超时时逐个检查它们,但这对我来说似乎是一个糟糕的解决方案。

任何想法表示赞赏。谢谢你。

        val smallCompletable1 = controller
        .checkInitialSettings()
        .doOnError {
            logError(it)
        }
        .ignoreElement()

        val smallCompletable2 = controller
        .checkServerStatus()
        .doOnError {
            logError(it)
        }
        .ignoreElement()

        val myCompletables: List<Completable> = listOf(
            smallCompletable1,
            smallCompletable2
        )

        val bigDisposable = Completable
        .mergeDelayError(myCompletables)
        .timeout(250, TimeUnit.MILLISECONDS)
        .subscribe(this::handleAllSucceeded, this::handleError)

        composition.add(bigDisposable)
4

1 回答 1

0

只是一个想法,但尝试使用一个包装器,该包装器会抛出您自定义定义的异常并覆盖异常消息。

val smallCompletable1 = controller
    .checkInitialSettings()
    .doOnError{...}
    .timeout(250, TimeUnit.MILLISECONDS)
    .ignoreElement()

val completable1 = Completable.create { emitter ->
    smallCompletable1.subscribe(
        { emitter.onComplete() },
        { exp -> emitter.onError([YourCustomException]) }
    )
}
// do the same for smallCompletable2

val myCompletables: List<Completable> = listOf(
    completable1,
    completable2
)
...

另外,我可能会将超时移至每个小的可完成项。如果在合并的可完成项上声明超时,我不确定您是否会从小型可完成项中获取错误,而不是为合并的可完成项引发的通用超时错误。

于 2019-11-06T17:06:05.960 回答