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页面或者大小很小的资源文件,去访问它,否自如果那个页面过大的话挺会消费用户的流量,比较这种验证不可能只做一次。


本篇博文主要以逻辑角度考虑, 代码没有贴, 主要是也简单。。。  希望本篇博文能够给您带来帮助!





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