android开发框架(四)监听网络连接状态

Android开发过程中,通常需要对网络连接状态进行判断,其目的可分为以下几种:

  • 避免无用的网络请求:当没有网络连接时或网络较差时,无需进行网络请求

  • 减少流量的消耗:当需要下载大文件或者加载视频,图片时,需要进行网络判断,减少流量的消耗

Android系统在ApplicationFrameWork为实现网络连接功能提供了ConnectivityManager,可以利用其进行网络的判断和监听。

  • 判断是否有网络连接
ConnectivityManager cm =
        (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null &&
                      activeNetwork.isConnectedOrConnecting();
  • 判断网络连接类型
    判断网络类型是wifi,还是3G,还是2G网络,对不同的网络进行不同的处理;
ConnectivityManager connectMgr = (ConnectivityManager) this
    .getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = connectMgr.getActiveNetworkInfo();

首先需要判断网络是否连接

  • 判断网络是否是wifi,在判断之前一定要进行的非空判断
info !=null &&
info.getType() == ConnectivityManager.TYPE_WIFI
  • 判断网络是否是手机网络
info !=null &&
info.getType() == ConnectivityManager.TYPE_MOBILE
  • 手机网络类型详细区分
    info.getSubtype() 这里使用 getSubtype(),不是 getType(),getType()返回的是0,或者1,是区分是手机网络还是wifi
    info.getSubtype()取值列表如下:
    • NETWORK_TYPE_CDMA 网络类型为CDMA
    • NETWORK_TYPE_EDGE 网络类型为EDGE
    • NETWORK_TYPE_EVDO_0 网络类型为EVDO0
    • NETWORK_TYPE_EVDO_A 网络类型为EVDOA
    • NETWORK_TYPE_GPRS 网络类型为GPRS
    • NETWORK_TYPE_HSDPA 网络类型为HSDPA
    • NETWORK_TYPE_HSPA 网络类型为HSPA
    • NETWORK_TYPE_HSUPA 网络类型为HSUPA
    • NETWORK_TYPE_UMTS 网络类型为UMTS
      联通的3G为UMTS或HSDPA,移动和联通的2G为GPRS或EDGE,电信的2G为CDMA,电信的3G为EVDO
      这个方法可用于具体的一些网络判断操作,比如只有4G网络下可加载等特殊情况。

开发过程中,可通过广播进行网络状态改变的监听
ConnectivityManager在网络状态改变时发送广播”android.net.conn.CONNECTIVITY_CHANGE”,所以,注册监听一下这个广播就可以:

<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>

最后是一种出于特殊情况的考虑,比如当WiFi连接成功,但是却无法使用网络,也就是没有网速,为了监测这种情况,我们可以在网络请求前,进行网速的判断,

  • 通过ping 判断网络能否请求成功

    示例:ping www.baidu.com

// network available cannot ensure Internet is available
public static boolean isNetWorkAvailable(final Context context) {
  Runtime runtime = Runtime.getRuntime();
  try {
    Process pingProcess = runtime.exec("/system/bin/ping -c 1 www.baidu.com");
    int exitCode = pingProcess.waitFor();
    return (exitCode == 0);
  } catch (Exception e) {
    e.printStackTrace();
  }
  return false;
}
  • 还可以模拟get请求

可以访问网址, 看 get 请求能不能成功
万能的百度。。

URL url = new URL("http://www.baidu.com");
HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
urlc.setConnectTimeout(3000);
urlc.connect();
if (urlc.getResponseCode() == 200) {
  return new Boolean(true);
}

结束~

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值