2014-09-17 9 views
19

In meiner App mache ich synchronePUT Anfragen mit der Retrofit-Bibliothek. Das Problem ist: manchmal wirft die Bibliothek EOFException s.EOFException in Retrofit während der Ausführung synchrone PUT Anfragen

Unten finden Sie eine Stack-Trace für einen solchen Fällen

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) 

ich folgende prosposed Lösungen ausprobiert, aber keiner von ihnen in meinem Fall geholfen:

Hier

ist, wie ich RestAdapter in meiner app erstellen:

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(); 

Hat jemand eine andere Lösung für das Problem wissen?

Btw, ich kann keine Lösungen mit System.setProperty("http.keepAlive", "false"); verwenden, weil ich aus Leistungsgründen meine Verbindung am Leben halten muss.

+0

Gibt der Server eine 204 für Sie zurück? – VM4

+0

Haben Sie das Problem gelöst? Ähnliches wird in [Ausgabe # 1114 von OkHttp] (https://github.com/square/okhttp/issues/1114) diskutiert. – JJD

+0

@JJD Nein, ich habe das Problem nicht gelöst. – Bobrovsky

Antwort

0

Vielleicht EOF als verlorene Netzwerkverbindung oder Zeitüberschreitung. Versuchen Sie, das Zeitlimit zu erhöhen und sicherzustellen, dass Keep-Alive gesetzt ist.

0

Sie können this answer mit ähnlichen Problem betrachten.

Wenn Sie mit großen Anforderungen (ich denke, das ist mehr als 50 MB Daten) und Sie nicht Paginierung System auf der Serverseite verwenden, können Sie diese Art von Fehler erhalten.

Es kann auch ein TimeOut der Server-Seite zum Beispiel sein.

0

Dieses Problem kann häufig durch einen Netzwerkfehler verursacht werden. Wenn es konsistent reproduziert wird, berücksichtigen Sie die mögliche Ursache für die Inhaltslänge und das Anforderungstimeout. Manchmal können zeitgesteuerte Netzwerkanforderungen ein falsches Ende der Datei zurückgeben. Was würde diesen Fehler als Ergebnis auslösen.

Verwandte Themen