2013-04-18 15 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

ようこそ。 –

1

あなたはhttp://hc.apache.org/httpcomponents-client-ga/tutorial/html/fundamentals.html#d5e249でApacheのドキュメントを見れば、それは、接続タイムアウトの例外は、IOExceptionがサブクラスであることを指摘しています。

具体的には、構成済みの接続タイムアウト内で接続を設定できない場合はConnectTimeoutExceptions、設定済みの場合はSocketTimeoutExceptionsのいずれかのデータが受信されます。