现象:
手机连接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没有外网的情况,固此情况不做任何处理。