Android HTTP 請求超過超時時間未返回 報錯java.net.UnknownHostException: Unable to resolve host
阿新 • • 發佈:2019-01-09
現象:手機連線WIFI,但未連線外網。設定urlCon.setConnectTimeout(5000); urlCon.setReadTimeout(8000); 在Android傳送Http請求時,時間超過設定的超時時間仍未返回。HTTP框架使用的是開源的Android Asynchronous Http Client。
原因:在傳送Http請求時,先要建立連線,設定的地址為域名,非IP。所以在連線前需要進行域名解析操作,這個解析時間是不可控的。所以設定的超時時間在這裡是不起作用的。
解決:
1、不使用域名,直接使用IP進行請求。
2、因為解析域名的時間不可控,且只在無網路的情況下產生此現象,固不進行處理,等待其正常返回。
解決問題的過程 :
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命令判斷網路是否可用:
此處扔然等待了10秒以上,才返回結果,固此方法不可行,附上判斷是否有網的程式碼如下:String ip = "www.baidu.com"; Process p = Runtime.getRuntime().exec("ping -c 2 -w 5 " + ip); p.waitFor();
結論:經過上面的排查,解析域名的時間是不可控的,且不僅在連線WIFI沒有外網的情況,固此情況不做任何處理。/** * 檢查是否能連線網路 */ 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; }