0

mergeDelayError()このAndroid Kotlinコードには、タイムアウトのあるより大きなものにマージされたcompletablesのリストがあります。タイムアウトに達すると、java.util.concurrent.TimeoutException: The source did not signal an event for 250 milliseconds and has been terminated.

リスト上の小さな補完可能なもののどれが、何も通知/発行せずにタイムアウトに達したかをどのように確認できますか (実際のリストには 2 つ以上の BTW があります)。私の理想的な解決策は、そのような例外を次のようなものに置き換えるException: The following operations reached a timeout: Check initial settings, Check serverか、少なくともタイムアウトした各補完可能ファイルによって出力される特定のログ行です。

これを行う方法がわかりません。私の最初の推測では、「didEmit」フラグを各コンプリータブルに追加し、大きなコンプリータブルでタイムアウトに達したときにそれらを 1 つずつチェックするだけですが、それは私には悪い解決策のように思えます。

どんなアイデアでも大歓迎です。ありがとうございました。

        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
)
...

また、代わりに、タイムアウトをそれぞれの小さな補完可能オブジェクトに移動することもできます。マージされた Completable でタイムアウトを宣言する場合、マージされた Completable に対してスローされる一般的なタイムアウト エラーではなく、小さな Completable からエラーが発生するかどうかはわかりません。

于 2019-11-06T17:06:05.960 に答える