doAfterSuccessオブザーバからエラーがスローされた場合は、私はretrofitを使用しているときonErrorは呼び出さずにアプリケーションクラッシュ(UndeliverableException)を受けますが、自分自身を作成してdoAfterSuccessオブザーバーonError呼び出しから例外をスローします。doAfterSuccessでエラーが発生した場合オブザーバーonErrorが呼び出されない
doAfterSuccessはなぜ2つの異なる方法で動作しますか。
doAfterSuccessオブザーバからエラーがスローされた場合は、私はretrofitを使用しているときonErrorは呼び出さずにアプリケーションクラッシュ(UndeliverableException)を受けますが、自分自身を作成してdoAfterSuccessオブザーバーonError呼び出しから例外をスローします。doAfterSuccessでエラーが発生した場合オブザーバーonErrorが呼び出されない
doAfterSuccessはなぜ2つの異なる方法で動作しますか。
Single
プロトコルは、onSubscribe (onSuccess | onError)?
と定義されています。言い換えれば、onSuccess
が呼び出された場合、onError
は呼び出すことができず、その逆もありません。 doAfterSuccess
は、このプロトコルに関してはどこにも行くことができず、重要な例外を失うのを避けるため、グローバルエラーハンドラにルーティングされます。 wikiには、より詳細な説明があります。
onSuccess
の後にonError
を呼び出したい場合は、おそらく間違ったタイプを使用している可能性があります。 Observable
プロトコルでは、onError
をwhitinまたはonNext
の後に呼び出すことができます。
また、信頼性の低いonSuccess
ハンドラにtry-catch
を使用し、onError
と同じコードを呼び出してください。
Single.just(1)
.doAfterSuccess(v -> {
try {
process(v);
} catch (Throwable ex) {
reportError(ex);
}
})
.subscribe(v -> { /* ok */ }, e -> { reportError(e); });