2012-09-25 65 views
2
public boolean isNetworkConnected() { 
    ConnectivityManager cm = 
     (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo netInfo = cm.getActiveNetworkInfo(); 
    if (netInfo != null && netInfo.isConnectedOrConnecting()) { 
     return true; 
    } 
    return false; 
} 

只要我的互聯網連接或斷開連接,此功能就能正常工作。但是,當我的互聯網連接時有一種情況,但由於互聯網中的某些問題,我們無法交換數據包,或者可以說無法瀏覽。即使在這種狀態下,我從該功能獲得true,而我只想在我的互聯網工作得很好時才返回true如何確保互聯網在Android上正常工作

在這種情況下我能做些什麼?謝謝。

回答

1

您可以嘗試例如HTTP獲取到google.com或其他高正常運行時間的網站。

1

在這種情況下,唯一可行的方法是下載一個小的已知文件並驗證其完整性。需要這種情況的一種情況是在開放式咖啡館wifis上。任何人都可以連接到他們,但所有網絡請求都會重定向到他們的「網關」,直到您接受他們的條款和條件。

1

是的,它發生在少數情況下,例如http超時例外,因爲可能會出現網絡連接但沒有實際的互聯網連接的情況,因爲訪問它的唯一方式是通過例如VPN--這樣有,另外,例如,WI-FI連接可用,但由於ISP的某些問題沒有實際的互聯網流量。

我建議你看看this線程,它解釋瞭如何做http請求並找出網絡可用性。

1

沒有辦法以編程方式獲得您正在尋找的信息。

如果存在「互聯網連接問題」,比如剛剛進入死區的蜂窩數據連接非常常見,您會看到蜂窩鏈接保持幾秒鐘,直至超時。在等待期間,雖然鏈路層仍然認爲它已經連接,但沒有數據包可以通過,唯一可以做的就是開始等待自己 - 然後選擇小於或等於鏈路層超時值的任意超時值。

由於基於超時的連接是基於等待任意一段時間,然後決定是否認爲數據包將到達,所以沒有通用的解決方案來確定 - 沒有阻塞 - 如果連接將會成功。畢竟,僅僅因爲之前發送的數據包通過了,並不意味着連接不會立即被殺死。

我不同意試圖從某個URL獲取小資源的測試。該測試是有問題的,因爲它涉及阻塞,這會減慢你的程序。如果程序實際嘗試發送的數據包在鏈路層或協議層超時之前能夠通過,您將得到結果。如果數據包無法通過,您將無法獲得結果。就這麼簡單。

互聯網連接是一個「短暫」現象:不可能確保它提前可用。它在那裏瞬間消失了。就像磁盤上存在一個文件一樣。與其試圖通過互聯網連接來改變程序邏輯的流程,您應該只是將反應爲,這種情況下連接性顯然不可用,例如數據包未通過,或者您沒有得到響應,或者網絡接口聲明它已關閉(實質上是你所調用的Android API在做什麼)。處理異常;不要試圖確定它是否起作用,然後做點什麼。

總之,一個isNetworkConnected()功能非常概念大多是毫無意義的,除了的鏈路層是否認爲它是連接或不簡單的測試(即多了,至少,可以節省您的時間和精力,因爲沒有鏈路層明顯暗示連接是已知的不可用,而所有其他故障狀態在實驗檢測到問題後纔會涉及未知狀態。)問題是,即使是最可靠和最嚴格的網絡可用性測試執行isNetworkConnected()不能原子上保證,在isNetworkConnected()函數返回的時間和你開始的時間之間試圖上傳/下載真實數據,結果沒有改變。它基本上是一種無法解決的競爭條件,因爲您不控制用戶的互聯網基礎設施,因此您不能自動將其「鎖定」到工作狀態,執行您的工作並釋放鎖定。無法完成。

相關問題