2015-04-02 51 views
2

所以這是一個相當的啓示 - 事實上,Android SDK似乎沒有可靠的方式來檢查互聯網接入。Android互聯網支票(非網絡支票)

請允許我澄清。

Android文檔&大多數在線樣品用在這裏發現了類似的一個辦法:https://stackoverflow.com/a/4009133/980917

類似的東西來:

public boolean isOnline() { 
    ConnectivityManager cm = 
     (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo netInfo = cm.getActiveNetworkInfo(); 
    return netInfo != null && netInfo.isConnectedOrConnecting(); 
} 

但是 - 這只是檢查,如果您連接到網絡並且不保證你可以到達互聯網。

對於那些沒有意識到這一點,通過從路由器上拔下「IN」以太網電纜或連接到任何未連接到互聯網的Wifi,它很容易重現。

KNOWN的變通辦法:

1)試圖達成一個網站:https://stackoverflow.com/a/5803489/980917 這是問題,因爲需要線程管理。

2)嘗試ping Google的DNS:https://stackoverflow.com/a/27312494/980917 不需要用線程封裝,但會凍結UI。

我正在尋找:

理想情況下,我想有一個互聯網檢查,這是一個實用工具類,一個簡單的靜態方法,可以從UI或業務邏輯代碼調用。由於上述解決方案不能很好地工作,因爲在調用者類中需要額外的開銷來處理線程管理。

有沒有什麼辦法可以在Android上獲得可靠的互聯網檢查而不會用線程管理代碼污染調用者類?

謝謝。

回答

1

我做了一個special class for this與一組靜態mehods。它有很好的知識,並在你的問題方法中顯示,以檢測網絡是否可用。它還有一個方法來檢查目標服務器/主機是否可以通過這個網絡到達 - checkIsServerReachable()。然而,由於它的網絡任務,它不能在UI線程上運行,所以這裏唯一的方法是使用AsyncTask,線程或回調。

+0

感謝您 - 將嘗試它。很好的實現已知的方法。我開始接受,我將不得不做一些重構,以確保所有的互聯網檢查不會在UI線程上運行。 – AlexVPerl 2015-04-02 19:40:52

+0

嗨,再次 - 我正在整合連接助手類,你有一個快速使用的例子,你可以提供?謝謝! – AlexVPerl 2015-04-04 23:17:22

+0

謝謝我結束了使用checkHostByConnection() - 這工作最好的解決方案。 – AlexVPerl 2015-04-05 15:33:19