2014-09-17 12 views
19

Nella mia app faccio sincroniPUT richieste utilizzando la libreria Retrofit. Il problema è: a volte la libreria genera EOFException s.EOFException in retrofit durante l'esecuzione di PUT sincrona richiede

Qui di seguito è una traccia dello stack per uno di questi casi

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) 

Ho provato le seguenti prosposed soluzioni, ma nessuno di loro ha aiutato nel mio caso:

Ecco come creo RestAdapter nella mia app:

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

Se uno sa un altra soluzione per il problema?

Btw, non posso utilizzare soluzioni che coinvolgono System.setProperty("http.keepAlive", "false"); perché è necessario mantenere la mia connessione attiva a causa di motivi di prestazioni.

+0

Il server restituisce un 204 per te? – VM4

+0

Sei riuscito a risolvere il problema? Simile è discusso in [numero 1114 di OkHttp] (https://github.com/square/okhttp/issues/1114). – JJD

+0

@JJD No Non ho risolto il problema. – Bobrovsky

risposta

0

Forse EOF come connessione di rete persa o scaduta. Prova ad aumentare il timeout e assicurati che sia impostato keep-alive.

0

È possibile guardare a this answer con un problema simile.

Se si dispone di grandi richieste (penso che siano più di 50 Mb di dati) e non si utilizzi il sistema di impaginazione sul lato server, è possibile ottenere questo tipo di errore.

Inoltre può essere un TimeOut del lato server, ad esempio.

0

Questo problema può essere causato in genere da un errore di rete. Se si sta riproducendo in modo coerente, considerare la causa potenziale della lunghezza del contenuto e del timeout della richiesta. A volte le richieste di rete scadute possono restituire una fine file errata. Quale avrebbe generato questo errore come risultato.

Problemi correlati