所以求助google大神,結果找到了一行程式碼,就可以判斷網路是否有連外能力
參考連結
程式碼如下
if (InetAddress.getByName("www.google.com.tw").isReachable(5000))
上述程式是看能否在五秒內連結 www.google.com.tw,如果連接上回傳true,反之回傳false但在後來測試的結果發現,不論wifi是否有對外連線能力,都會回傳false
所以又馬上求助google大神,看問題是出在哪邊
發現網路上有很多人跟遇到跟我一樣的問題
程式碼雖然精簡,但不能正常運作,所以只好退而求其次
找尋是否能有在Android程式下執行ping指令
我找到的程式碼如下
參考連結
Process p1 = java.lang.Runtime.getRuntime().exec("ping -c 1 www.google.com");
int returnVal = p1.waitFor();
boolean reachable = (returnVal==0);
上述程式碼,是對www.google.com.tw ping 一次,如果ping成功會回傳0,失敗會回傳-1在有連外網路的狀況下的確會回傳0,但在ping不到的情況下,thread會在那一直等待ping的結果
於是我又要求助google大神,結果發現了兩種解法
- 設定 ping的參數
- 對執行 Process做的動作執行timeout的機制
//-c 是指ping的次數 3是指ping 3次 ,-w 100 w是以秒為單位的間隔時間,100是指timeout 100秒
Process p1 = Runtime.getRuntime().exec("ping -c 3 -w 100 " + str);
參考連結
public static int timeoutInSeconds=5;
Process p1 = java.lang.Runtime.getRuntime().exec("ping -c 1 www.google.com");
int retrunVal;
//取得目前系統時間
long now = System.currentTimeMillis();
//timeout時間為5秒
long timeoutInMillis = 1000L * timeoutInSeconds;
long finish = now + timeoutInMillis;
//當p1 alive及timeout還沒發生時,繼續在迴圈中
while ( isAlive( p1 ) && ( System.currentTimeMillis() < finish ) )
{
Thread.sleep( 10 );
}
public static boolean isAlive( Process p ) {
try
{
//p結束的值
p.exitValue();
return false;
} catch (IllegalThreadStateException e) {
return true;
}
}
上述的程式碼是透過process是否已經取得值加上timeout的機制 來判斷是否真的有ping到網頁 當呼叫isAlive時,會去偵測p是否結束並且有回傳值,如果沒有值發生exception回傳true while迴圈則利用isAlive及時間是否超過timeout時間,來判斷是否取得ping值
參考連結