您的位置:首页 > 理论基础 > 计算机网络

Android HTTP 请求超过超时时间未返回 报错java.net.UnknownHostException: Unable to resolve host

2015-11-02 18:03 706 查看
现象:手机连接WIFI,但未连接外网。设置urlCon.setConnectTimeout(5000); urlCon.setReadTimeout(8000); 在Android发送Http请求时,时间超过设置的超时时间仍未返回。HTTP框架使用的是开源的Android Asynchronous Http Client。

原因:在发送Http请求时,先要建立连接,设置的地址为域名,非IP。所以在连接前需要进行域名解析操作,这个解析时间是不可控的。所以设置的超时时间在这里是不起作用的。

解决:

1、不使用域名,直接使用IP进行请求。

2、因为解析域名的时间不可控,且只在无网络的情况下产生此现象,固不进行处理,等待其正常返回。

解决问题的过程:

1、设置HTTP超时时间

AndroidHttpClient httpClient = new AndroidHttpClient(MAIN_URL);
httpClient.setConnectTimeout(5000);
httpClient.setReadTimeout(8000);
结果未起任何作用,继续排查问题

2、在Http请求前,判断是否已连接WIFI,但是没有外网的情况

在请求前使用ping命令判断网络是否可用:

String ip = "www.baidu.com";
Process p = Runtime.getRuntime().exec("ping -c 2 -w 5 " + ip);
p.waitFor();
此处扔然等待了10秒以上,才返回结果,固此方法不可行,附上判断是否有网的代码如下:

/**
* 检查是否能连接网络
*/
public static boolean check_connect_net(Context con) {
ConnectivityManager cwjManager = (ConnectivityManager) con
.getSystemService(Context.CONNECTIVITY_SERVICE);
try {
if (cwjManager.getActiveNetworkInfo() != null
&& cwjManager.getActiveNetworkInfo().isAvailable()) {
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
结论:经过上面的排查,解析域名的时间是不可控的,且不仅在连接WIFI没有外网的情况,固此情况不做任何处理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: