Ответ 1
Возможно, EOF как потерянное сетевое соединение или тайм-аут. Попытайтесь увеличить тайм-аут и обеспечить сохранение работоспособности.
В моем приложении я делаю синхронные запросы PUT
, используя библиотеку Retrofit. Проблема в том, что иногда библиотека бросает EOFException
s.
Ниже приведен тракт стека для одного из таких случаев.
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)
Я пробовал следующие предполагаемые решения, но ни один из них не помог в моем случае:
Вот как я создаю 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");
, потому что мне нужно поддерживать мое соединение по причине производительности.
Возможно, EOF как потерянное сетевое соединение или тайм-аут. Попытайтесь увеличить тайм-аут и обеспечить сохранение работоспособности.
Вы можете посмотреть этот ответ с аналогичной проблемой.
Если у вас большие запросы (я думаю, что это более 50 МБ данных), и вы не используете систему разбиения на страницы на стороне сервера, вы можете получить этот тип ошибок.
Кроме того, это может быть TimeOut на стороне сервера, например.
Эта проблема обычно может быть вызвана сетевой ошибкой. Если он воспроизводит последовательно, рассмотрите потенциальную причину длины контента и тайм-аута запроса. Иногда время ожидания сетевых запросов может вернуть неправильный конец файла. Который бы выбросил эту ошибку в результате.