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超时时间
2、在Http请求前,判断是否已连接WIFI,但是没有外网的情况
在请求前使用ping命令判断网络是否可用:
原因:在发送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没有外网的情况,固此情况不做任何处理。
相关文章推荐
- 理解HTTP幂等性
- 使用libcurl 编写Linux下Http客户端
- 关于HTTP请求体格式
- Xcode升级之后Http协议改为Https协议
- HTTP协议详解之User Agent篇
- Android网络开发 请求队列
- Android访问网络,使用HttpURLConnection还是HttpClient?
- Java笔记--网络编程
- Spring3中js/css/jpg/gif等静态资源无法找到(No mapping found for HTTP request with URI)问题解决
- HTTP协议详解之基本认证篇
- 网络加密与认证技术
- 如何用Tomcat和Openssl构建HTTPS双向认证环境(HTTPS客户端认证)
- Xcode7 关于http协议的修改,编译出错的解决方法
- 多线程(GCD,socket,http.TCP,UDP,block)
- FragMent,ViewPager 实现每个页面都请求网络。
- 解决Xcode 7 http无法使用的问题
- HTTP协议详解之请求篇
- Java使用TCP聊天程序
- HTTP协议详解之URL篇
- 网络基础