2013-04-18 10 views
6

Sono un po 'confuso su come funzionano i timeout in DefaultHttpClient.Timeout in DefaultHttpClient

sto usando questo codice:

private DefaultHttpClient createHttpClient() { 
     HttpParams my_httpParams = new BasicHttpParams(); 

     HttpConnectionParams.setConnectionTimeout(my_httpParams, 3000); 
     HttpConnectionParams.setSoTimeout(my_httpParams, 15000); 

     SchemeRegistry registry = new SchemeRegistry(); 
     registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
     ThreadSafeClientConnManager multiThreadedConnectionManager = new ThreadSafeClientConnManager(my_httpParams, registry); 

     DefaultHttpClient httpclient = new DefaultHttpClient(multiThreadedConnectionManager, my_httpParams); 

     return httpclient; 
} 

.

String url = "http://www.example.com"; 

DefaultHttpClient httpclient = createHttpClient(); 
HttpGet httpget = new HttpGet(url); 

try { 
    HttpResponse response = httpclient.execute(httpget); 
    StatusLine statusLine = response.getStatusLine(); 
    mStatusCode = statusLine.getStatusCode(); 

    if (mStatusCode == 200){ 
     content = EntityUtils.toString(response.getEntity()); 
    } 

} catch (ClientProtocolException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} catch (IllegalStateException e){ 
    e.printStackTrace(); 
} 

Quando 15 secondi sono passati e non tutti i dati sono stati ricevuti, saranno gettati un'eccezione, giusto? Ma su quale metodo? Ho pensato che fosse il metodo .execute(httpget) ma quello mi dice solo che genera ClientProtocolException e IOException. Qualcuno potrebbe aiutarmi a chiarire questo?

risposta

13

Fa eccezione a execute(). Il genitore di SocketTimeoutException è un IOException. Un blocco catch catching IOException sarà in grado di catturare entrambi.

Prova a eseguire questo codice.

HttpParams my_httpParams = new BasicHttpParams(); 
HttpConnectionParams.setConnectionTimeout(my_httpParams, 3000); 
HttpConnectionParams.setSoTimeout(my_httpParams, 1); 
DefaultHttpClient defaultHttpClient = new DefaultHttpClient(my_httpParams); 
HttpGet httpGet = new HttpGet("http://google.com"); 
defaultHttpClient.execute(httpGet); 

Risultato in questa eccezione.

java.net.SocketTimeoutException: Read timed out 
    at java.net.SocketInputStream.socketRead0(Native Method) 
    at java.net.SocketInputStream.read(Unknown Source) 
    ... 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:784) 

Si può sempre scegliere di elaborare in modo selettivo l'eccezione per la cattura e la manipolazione delle IOException tardi.

try 
{ 
    // Your code 
} 
catch (SocketTimeoutException e) 
{ 
    // handle timeouts 
    e.printStackTrace(); 
} 
catch (IOException e) 
{ 
    // handle other IO exceptions 
    e.printStackTrace(); 
} 
+0

Ok, ho capito, grazie per la tua risposta chiara! – Xander

+0

Prego. –

1

Se si guarda la documentazione Apache a http://hc.apache.org/httpcomponents-client-ga/tutorial/html/fundamentals.html#d5e249, essa rileva che le eccezioni di timeout di connessione sono sottoclassi IOException.

Per essere più precisi, credo che faranno sia ConnectTimeoutExceptions se la connessione non può essere impostato all'interno del tuo timeout di connessione configurato, o SocketTimeoutExceptions, se è impostato ma non vengono ricevuti dati per il vostro configurata in modo timeout.