Android網絡連接驗證

Android網絡連接驗證

在移動應用的開發中, 需要注意的一個問題就是當前設備的網絡連通性。  設備並不是所有時候都是網絡連通的狀態,甚至是當前設備的網絡會根據你的移動的距離或速度而改變(比如在高速,在城市的中間分叉)都會改變你設備的網絡。

Android中提供了ConnectivityManager管理類讓我們判斷當前設備是否具有網絡連接狀態。 但如果單單使用這個對象並不能很好的知道當前設備是否能夠連接到外網資源。
現在在網絡上查找到的資料基本上都是以下的方式去驗證當前網絡是否可用:
private boolean isNetWorkReachable() {
        NetworkInfo mNetWorkInfo = ((ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
        if (mNetWorkInfo == null) {
            return false;
        }
        
        return mNetWorkInfo.getState() == NetworkInfo.State.CONNECTED;
    }

但是這麼書寫還是存在一定的問題,還需要添加一些網路連接的驗證。
以上書寫的代碼只是判斷一下當前設置的哪個網絡接口是活躍的。(WIFI接口,2.5G接口,3G接口,4G接口, 甚至是以後的5G接口) 。
只要是開啓了他們之中的任意一個,那麼你以上的表達式就判定爲當前設備是有網絡存在的。

在很多情況下,當前設備可能佔用了這個網絡接口,但是並不能夠實際的訪問外部網絡! 最常見的可能就是WIFI接口,我們多次連接到了一個沒有Internater訪問權限的WIFI,
這個時候我們當前設備是不能夠連接到外網資源,但我們的WIFI接口被判斷爲了活躍狀態。

如果你的項目是一個需要網絡支撐的話,就要小心處理這種問題了。。

說了那麼多,如何有效的解決呢?

有兩種方案:
第一種就是使用Socket對象訪問以下別人服務器的DNS, 看看能不能跑通(connect方法),跟我們Windows系統下的dos命令- ping 命令一樣。
這種方法可以很有效的解決,  非常的節省流量。筆者建議採用此種方式。



第二種方式當然可以使用: 就是建立一個HttpURLConnection對象,去訪問一個資源,調用它的getResponseCode()方法, 看能不能在try代碼塊裏面執行成功,如果可以則定位當前設備是可以訪問外網資源的,否則就判定不能訪問外網資源。  這種方式也是非常簡單。
注意: 第二種方式的訪問需要注意一下URL地址,不要訪問的頁面太大, 通常情況下建議爲你在後臺服務器上建立一個空的html頁面或者大小很小的資源文件,去訪問它,否自如果那個頁面過大的話挺會消費用戶的流量,比較這種驗證不可能只做一次。


本篇博文主要以邏輯角度考慮, 代碼沒有貼, 主要是也簡單。。。  希望本篇博文能夠給您帶來幫助!





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章