2013-04-18 35 views
6

Tôi hơi bối rối về cách hết thời gian chờ trong công việc DefaultHttpClient.Timeout trong DefaultHttpClient

Tôi đang sử dụng mã này:

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

Khi 15 giây trôi qua và không phải tất cả dữ liệu đã được nhận, ngoại lệ sẽ được ném, phải không? Nhưng trên phương pháp nào? Tôi nghĩ nó là phương pháp .execute(httpget) nhưng phương pháp đó chỉ cho tôi biết nó ném ClientProtocolExceptionIOException. Bất cứ ai có thể giúp tôi làm rõ điều này?

Trả lời

13

Nó ném một ngoại lệ trên execute(). Phụ huynh của SocketTimeoutException là số IOException. Việc xử lý khối catch IOException sẽ có thể bắt cả hai.

Hãy thử thực thi mã này.

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

Kết quả là ngoại lệ này.

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) 

Bạn luôn có thể chọn xử lý có chọn lọc ngoại lệ bằng cách bắt và xử lý IOException sau đó.

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

OK, tôi hiểu rồi, cảm ơn bạn đã trả lời rõ ràng! – Xander

+0

Bạn được chào đón. –

1

Nếu bạn xem tài liệu Apache tại http://hc.apache.org/httpcomponents-client-ga/tutorial/html/fundamentals.html#d5e249, lưu ý rằng ngoại lệ thời gian kết nối là các lớp con IOException.

Để cụ thể hơn, tôi tin rằng chúng sẽ là ConnectTimeoutExceptions nếu kết nối không thể được thiết lập trong thời gian chờ kết nối được định cấu hình hoặc SocketTimeoutExceptions, nếu thiết lập xong nhưng không nhận được dữ liệu cho thời gian chờ SO đã định cấu hình của bạn.