2013-04-18 27 views
6

我對DefaultHttpClient中的超時工作方式有點困惑。DefaultHttpClient中的超時

我使用這個代碼:

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

當第15秒過去了,不是所有的數據已收到,一會拋出異常,對不對?但在哪個方法?我認爲這是.execute(httpget)方法,但只有一個告訴我它拋出ClientProtocolExceptionIOException。任何人都可以幫我澄清這一點嗎?

回答

13

它確實在​​上拋出異常。 SocketTimeoutException的母公司是IOException。一個捕獲塊處理IOException將能夠捕獲兩者。

嘗試執行此代碼。

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

它導致此例外。

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) 

您可以隨時選擇通過捕捉並處理IOException後有選擇地處理異常。

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

好的,我明白了,謝謝你的明確回答! – Xander

+0

不客氣。 –

相關問題