1. 程式人生 > >Android HTTP 請求超過超時時間未返回 報錯java.net.UnknownHostException: Unable to resolve host

Android HTTP 請求超過超時時間未返回 報錯java.net.UnknownHostException: Unable to resolve host

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