美文网首页
[转]Android HTTP 请求超过超时时间未返回 报错ja

[转]Android HTTP 请求超过超时时间未返回 报错ja

作者: 努力深耕Android的小透明 | 来源:发表于2017-12-19 17:05 被阅读129次

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

附上:原文地址

相关文章

网友评论

      本文标题:[转]Android HTTP 请求超过超时时间未返回 报错ja

      本文链接:https://www.haomeiwen.com/subject/nrliwxtx.html