現象:
手機連接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沒有外網的情況,固此情況不做任何處理。