2016-04-06 84 views
14

OkHttpライブラリでは、アプリケーションはSocketTimeoutExceptionの問題に直面しています。要求サイズが小さければ、それは正常に動作しています(1MB未満)。 10秒以内にこの例外が発生しています。ソケットタイムアウト(readTimeout)の値がさらに高いです。一貫して要求に失敗しています(サイズは1.8MBです)。 HttpUrlConnectionでリクエストを実行したときに正常に動作しています。失敗の理由は何でしょうか?java.net.SocketTimeoutException:タイムアウト

03-29 12:16:38.997 32066-4018/com.mobile W/System.err: java.net.SocketTimeoutException: timeout 
    03-29 12:16:38.997 32066-4018/com.mobile W/System.err:  at okio.Okio$3.newTimeoutException(Okio.java:207) 
    03-29 12:16:38.997 32066-4018/com.mobile W/System.err:  at okio.AsyncTimeout.exit(AsyncTimeout.java:261) 
    03-29 12:16:38.997 32066-4018/com.mobile W/System.err:  at okio.AsyncTimeout$1.write(AsyncTimeout.java:158) 
    03-29 12:16:38.997 32066-4018/com.mobile W/System.err:  at okio.RealBufferedSink.emitCompleteSegments(RealBufferedSink.java:176) 
    03-29 12:16:38.997 32066-4018/com.mobile W/System.err:  at okio.RealBufferedSink.write(RealBufferedSink.java:46) 
    03-29 12:16:38.997 32066-4018/com.mobile W/System.err:  at okhttp3.internal.http.Http1xStream$FixedLengthSink.write(Http1xStream.java:286) 
    03-29 12:16:38.997 32066-4018/com.mobile W/System.err:  at okio.RealBufferedSink.emitCompleteSegments(RealBufferedSink.java:176) 
    03-29 12:16:38.997 32066-4018/com.mobile W/System.err:  at okio.RealBufferedSink.write(RealBufferedSink.java:96) 
    03-29 12:16:38.997 32066-4018/com.mobile W/System.err:  at okhttp3.RequestBody$2.writeTo(RequestBody.java:96) 
    03-29 12:16:38.997 32066-4018/com.mobile W/System.err:  at okhttp3.internal.http.HttpEngine$NetworkInterceptorChain.proceed(HttpEngine.java:704) 
    03-29 12:16:38.997 32066-4018/com.mobile W/System.err:  at okhttp3.internal.http.HttpEngine.readResponse(HttpEngine.java:563) 
    03-29 12:16:38.997 32066-4018/com.mobile W/System.err:  at okhttp3.RealCall.getResponse(RealCall.java:241) 
    03-29 12:16:38.997 32066-4018/com.mobile W/System.err:  at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:198) 
    03-29 12:16:38.998 32066-4018/com.mobile W/System.err:  at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:160) 
    03-29 12:16:38.998 32066-4018/com.mobile W/System.err:  at okhttp3.RealCall.execute(RealCall.java:57) 
    03-29 12:16:38.998 32066-4018/com.mobile W/System.err:  at com.mobizio.api.BaseApi.sendOkHttpRequest(BaseApi.java:81) 
    03-29 12:16:38.998 32066-4018/com.mobile W/System.err:  at com.mobizio.api.BaseApi.doInBackground(BaseApi.java:45) 
    03-29 12:16:38.998 32066-4018/com.mobile W/System.err:  at com.mobizio.api.BaseApi.doInBackground(BaseApi.java:30) 
    03-29 12:16:38.998 32066-4018/com.mobile W/System.err:  at android.os.AsyncTask$2.call(AsyncTask.java:292) 
    03-29 12:16:38.998 32066-4018/com.mobile W/System.err:  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
    03-29 12:16:38.998 32066-4018/com.mobile W/System.err:  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
    03-29 12:16:38.998 32066-4018/com.mobile W/System.err:  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
    03-29 12:16:38.998 32066-4018/com.mobile W/System.err:  at java.lang.Thread.run(Thread.java:818) 
    03-29 12:16:38.998 32066-4018/com.mobile W/System.err: Caused by: java.net.SocketException: socket is closed 
    03-29 12:16:38.998 32066-4018/com.mobile W/System.err:  at com.android.org.conscrypt.OpenSSLSocketImpl$SSLOutputStream.write(OpenSSLSocketImpl.java:759) 
    03-29 12:16:38.998 32066-4018/com.mobile W/System.err:  at okio.Okio$1.write(Okio.java:80) 
    03-29 12:16:38.998 32066-4018/com.mobile W/System.err:  at okio.AsyncTimeout$1.write(AsyncTimeout.java:155) 
    03-29 12:16:38.998 32066-4018/com.mobile W/System.err: ... 20 more 
+0

あなたのクライアント値をより大きな読み出し時間を与えます。ストリームがソケットから読み込まれるときにタイムアウトが発生しているようです。 –

+0

@NikolaDespotoski私は既にこの問題に直面していますが、ソケットタイムアウトを15分に設定しました。 – Vivek

答えて

22

OkHttp 3では、OkHttpのデフォルト値は10秒です。タイムアウトを30秒に増やすことができます。

OkHttpClient client = new OkHttpClient(); 
client.setConnectTimeout(30, TimeUnit.SECONDS); // connect timeout 
client.setReadTimeout(30, TimeUnit.SECONDS); // socket timeout 
+0

接続タイムアウト値を30秒に、ソケットタイムアウト値を15分に設定しました。それでも私は同じ問題に直面しており、アプリは10秒以内に例外を超越しています – Vivek

+0

@Vivekあなたは解決策を見つけましたか? – DBragion

+1

@ DBragion Squareが提供するドキュメントに従って、https://github.com/square/okhttp/wiki/Recipes。要求サイズが1MiB以上の場合は、このポストストリング方式を使用しないことをお勧めします。 HttpUrlConnectionメソッドにフォールバックすることも、ドキュメントで説明されているポストストリーミングを実装することもできます。 – Vivek

15

writeTimeout()を解決しました。

試してみてください。

OkHttpClient.Builder builder = new OkHttpClient.Builder(); 
builder.connectTimeout(5, TimeUnit.MINUTES) 
.writeTimeout(5, TimeUnit.MINUTES) 
.readTimeout(5, TimeUnit.MINUTES); 

okHttpClient = builder.build(); 
関連する問題