2014-09-17 7 views
19

В моем приложении я делаю синхроннымPUT запросов с использованием библиотеки Дополнения. Проблема в том, что иногда библиотека бросает EOFException с.EOFException в Модернизации при выполнении синхронных запросов PUT

Ниже приведен трассировку стека для одного из таких случаев

29099-29269/com.mycompany.myapp D/Retrofit﹕ java.io.EOFException 
    at okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:192) 
    at com.squareup.okhttp.internal.http.HttpConnection.readResponse(HttpConnection.java:189) 
    at com.squareup.okhttp.internal.http.HttpTransport.readResponseHeaders(HttpTransport.java:101) 
    at com.squareup.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:676) 
    at com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:426) 
    at com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:371) 
    at com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:466) 
    at retrofit.client.UrlConnectionClient.readResponse(UrlConnectionClient.java:73) 
    at retrofit.client.UrlConnectionClient.execute(UrlConnectionClient.java:38) 
    at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:321) 
    at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:240) 
    at $Proxy7.addEvents(Native Method) 
    at com.mycompany.myapp.api.MyService.addEvents(MyService.java:59) 

Я попытался следующие prosposed решения, но ни один из них не помог в моем случае:

Вот как я создаю RestAdapter в моем приложении:

OkHttpClient okHttpClient = new OkHttpClient(); 

RestAdapter restAdapter = new RestAdapter.Builder() 
    .setEndpoint(Url) 
    .setRequestInterceptor(new RequestInterceptor() 
    { 
     @Override 
     public void intercept(RequestFacade request) 
     { 
      request.addHeader("Accept", "application/json"); 
      request.addHeader("Content-Type", "application/json"); 
     } 
    }) 
    .setClient(new OkClient(okHttpClient)) 
    .setLogLevel(RestAdapter.LogLevel.FULL) 
    .setErrorHandler(new MyErrorHandler()) 
    .build(); 

знает любые один в другое решение для этой проблемы?

Btw, я не могу использовать решения, связанные с System.setProperty("http.keepAlive", "false");, потому что мне нужно поддерживать мое соединение живым из-за соображений производительности.

+0

Является ли сервер, возвращающий вам 204? – VM4

+0

Вам удалось решить проблему? Подобный обсуждается в [номер статьи 1114 OkHttp] (https://github.com/square/okhttp/issues/1114). – JJD

+0

@JJD Нет. Я не решил проблему. – Bobrovsky

ответ

0

Возможно, EOF как потерянное сетевое соединение или тайм-аут. Попытайтесь увеличить тайм-аут и обеспечить сохранение работоспособности.

0

Вы можете посмотреть на this answer с аналогичной проблемой.

Если у вас большие запросы (я думаю, что это более 50 МБ данных), и вы не используете систему разбиения на страницы на стороне сервера, вы можете получить этот тип ошибок.

Также может быть TimeOut серверной части, например.

0

Эта проблема обычно может быть вызвана сетевой ошибкой. Если он воспроизводит последовательно, рассмотрите потенциальную причину длины контента и тайм-аута запроса. Иногда время ожидания сетевых запросов может вернуть неправильный конец файла. В результате эта ошибка будет выбрана.