2017-09-20 23 views
2
private boolean isRecoverable(IOException e, boolean requestSendStarted) { 
    .... 
    // If there was an interruption don't recover, but if there was a 
    //timeout connecting to a route 
    // we should try the next route (if there is one). 
    if (e instanceof InterruptedIOException) { 
     return e instanceof SocketTimeoutException && !requestSendStarted; 
    } 
    .... 
    return true; 
} 

はここOKHttpRetryAndFollowUpInterceptorのコードスニペットがあるときに再試行しないように設計されています。なぜOKHttpはしてSocketTimeoutException

とrequestSendStarted == trueの場合、OkHttpは再試行しません。

私はいくつかの他のルータが存在する場合、我々は目標はOkHttpがまったく接続できませんでした場合は再試行するようにした

答えて

2

別のIPやルータを再試行することができると思いますので。サーバーが到達可能であったにもかかわらず遅く応答しただけであれば、再試行が役に立たないアプリケーション層の問題になりそうです。

+1

私には意味があります。したがって、ユーザーが再試行したい場合は、OKHttp Sourceを変更するか、この種のExceptionsをキャッチしてカスタムインターセプタで何かを行うことができます。 – cafecat

+0

ええ、あなたはインターセプターで例外を捕まえて、自分でやり直すことができます。 –

2

要求が正常に送信され、応答データがクライアントに送信されたときに問題が発生した場合を考えます。この場合の自動再試行は、サーバーが何らかのアクション(いくつかのカウントを増やしたり、どこかにレコードを書き込む)を繰り返す可能性があり、望ましくない可能性があります。 OKHttpでは、ユーザーはこの場合に何をすべきかを決めることができます。

+0

これは、ユーザーがこの種の例外をキャッチし、カスタムインターセプタで何かできることを意味しますか? – cafecat

+0

@cafecatたとえばonFailureコールバックのユーザーは、何をすべきかを決めることができます - 別の要求を送信するか、エラーメッセージを表示するか、何か他のことをしてください。 – algrid

関連する問題