2016-04-06 29 views
14

OkHttp लाइब्रेरी के साथ, SocketTimeoutException समस्या का पालन कर रहा है। अगर अनुरोध का आकार कम है, तो यह ठीक काम कर रहा है (1 एमबी से कम)। मुझे यह अपवाद 10 सेकंड के भीतर मिल रहा है, यहां तक ​​कि मेरा सॉकेट टाइमआउट (readTimeout) मान बहुत अधिक है। यह लगातार अनुरोध के लिए असफल रहा है (आकार 1.8 एमबी है)। जब मैंने 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 के लिए ओकेएचटीपी के लिए डिफ़ॉल्ट मान 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

@ विवेक आपको समाधान मिला? – DBragion

+1

@DBragion स्क्वायर https://github.com/square/okhttp/wiki/Recipes द्वारा प्रदान किए गए दस्तावेज़ों के अनुसार। यह सुझाव दिया जाता है कि अगर अनुरोध आकार 1 एमआईबी है तो इस पोस्ट स्ट्रिंग विधि का उपयोग न करें। आप 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();