我正在编写一个连接到Web服务的应用程序,如果它无法 Build 连接,我不希望它等待太久 . 因此,我设置了httpparams的connectionTimeout . 但它似乎没有任何影响 .
测试我暂时关闭我的WLAN . 应用程序尝试连接相当长的时间(超过我想要的3秒),然后抛出UnknownHostException .
这是我的代码:
try{
HttpClient httpclient = new DefaultHttpClient();
HttpParams params = httpclient.getParams();
HttpConnectionParams.setConnectionTimeout(params, 3000);
HttpConnectionParams.setSoTimeout(params, 3000);
httppost = new HttpPost(URL);
StringEntity se = new StringEntity(envelope,HTTP.UTF_8);
httppost.setEntity(se);
//Code stops here until UnknownHostException is thrown.
BasicHttpResponse httpResponse = (BasicHttpResponse) httpclient.execute(httppost);
HttpEntity entity = httpResponse.getEntity();
return entity;
}catch (Exception e){
e.printStackTrace();
}
任何人都有我想念的想法吗?
5 回答
尝试这样做:
然后你可以 grab 一个可能ConnectTimeoutException .
使用标记的解决方案,我仍然在30秒后收到UnknownHostException . 在这种情况下,设备连接到wifi路由器,但没有互联网访问 .
采取的方法是启动一个只会尝试解析主机名的AsyncTask . 阻塞调用每250毫秒检查一次是否成功,4秒后它将取消该任务并返回 .
这就是我解决它的方法:
然后,每当我想要进行Web调用时,都会在函数开头调用它:
见:https://stackoverflow.com/a/20031077/2609238
问题可能出在Apache HTTP Client中 . 请参阅HTTPCLIENT-1098 . 在4.1.2中修复 .
超时异常尝试将DNS反转为IP,以进行日志记录 . 这需要额外的时间,直到实际触发异常 .
这个方法适合我: