2017-11-24 42 views
0

doAfterSuccessオブザーバからエラーがスローされた場合は、私はretrofitを使用しているときonErrorは呼び出さずにアプリケーションクラッシュ(UndeliverableException)を受けますが、自分自身を作成し​​てdoAfterSuccessオブザーバーonError呼び出しから例外をスローします。doAfterSuccessでエラーが発生した場合オブザーバーonErrorが呼び出されない

doAfterSuccessはなぜ2つの異なる方法で動作しますか。

答えて

0

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); }); 
関連する問題