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);
}
结束~