网络连接与判断


现在app大多都需要从网络上获得数据。所以访问网络是在所难免。但是再访问网络之前,我们应该先做一下网络的状态判断。其实在访问网络之前我们要做一些状态判断,对应一些状态判断来做处理,并不是直接使用Http访问网络即可。很多人在开发就经常把网络这块直接跳过,直接访问网络,可以一断网,各种体验效果不好,不是说app没法用,只是体验效果差。还有,就是我们可能为用户考虑,因为现在一般连网是wifi和手机流量,都知道后者收费是比较高的。假如我们的app加载的图片或者有大的数据下载操作,可是用户的本意是要是在流量下的话就不要操作这些很费流量的的操作,这样就必须要我们做一些连网状态的判断。网络是否连接良好,连接的wifi还是流量,断网或者网络改变了的时候怎么做,这都是一些细节,但是要注意处理。

 

我们在做访问的时候都得进行判断是否连网。判断连网也比较简单,就用到了两个类。ConnectivityManagerNetworkInfo

 

只要执行下面的代码就可以了。

  1. ConnectivityManager connMgr = (ConnectivityManager) context  
  2.             .getSystemService(Context.CONNECTIVITY_SERVICE);  
  3.     NetworkInfo networkInfo = connMgr  
  4.             .getNetworkInfo(ConnectivityManager.TYPE_WIFI);  
  5.     boolean isWifiConn = networkInfo.isConnected();  
  6.     networkInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);  
  7.     boolean isMobileConn = networkInfo.isConnected();  
	ConnectivityManager connMgr = (ConnectivityManager) context
				.getSystemService(Context.CONNECTIVITY_SERVICE);
		NetworkInfo networkInfo = connMgr
				.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
		boolean isWifiConn = networkInfo.isConnected();
		networkInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
		boolean isMobileConn = networkInfo.isConnected();


 

只要有一个连接就是有网,NetworkInfo就是网络的信息。还有一种更简便的判断是否连网的方法。

  1. ConnectivityManager connMgr = (ConnectivityManager) context  
  2.                 .getSystemService(Context.CONNECTIVITY_SERVICE);  
  3.         NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();  
ConnectivityManager connMgr = (ConnectivityManager) context
				.getSystemService(Context.CONNECTIVITY_SERVICE);
		NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();

 

在一个就是监听网络变化,就是设置一个广播。

注册广播,监听ConnectivityManager.CONNECTIVITY_ACTION这个action

  1. IntentFilter filter = new IntentFilter(  
  2.                     ConnectivityManager.CONNECTIVITY_ACTION);  
  3.             receiver = new NetworkReceiver();  
  4.             context.registerReceiver(receiver, filter);  
IntentFilter filter = new IntentFilter(
					ConnectivityManager.CONNECTIVITY_ACTION);
			receiver = new NetworkReceiver();
			context.registerReceiver(receiver, filter);


 

再实现一个广播类就可以了。这样网络一变化,就会受到广播,然后执行对应操作了。

  1. public class NetworkReceiver extends BroadcastReceiver {  
  2.         @Override  
  3.         public void onReceive(Context context, Intent intent) {  
  4.             Log.i("TAG", "intent============>>>>" + intent.toString());  
  5.               
  6.         }  
  7.     }  
public class NetworkReceiver extends BroadcastReceiver {
		@Override
		public void onReceive(Context context, Intent intent) {
			Log.i("TAG", "intent============>>>>" + intent.toString());
			
		}
	}


下面就是来说一下判断手机网络的类型了,2G,3G,4G

关于网络类型,在得到networkInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);这个后,确定是手机网络后,通过networkInfo.getSubtype()会得到网络的类型,用networkInfo.getSubtypeName()会得到网络的名字。

我们通过这个networkInfo.getSubtype()得到的类型来判断当前是什么网络。

其实,Android的Api中已经定义了各种网络状态,不是在ConnectivityManager里面定义的,而是在TelephonyManager里面的定义的。通过不同的api版本的修改,目前增加到了14个状态值:

下面是通过自己查资料,和看别人查资料实验得来的。整理如下:

 

  1. --------------------Added in API level 1---------------------  
  2. public static final int NETWORK_TYPE_UNKNOWN  
  3. Network type is unknown  
  4. Constant Value: 0 (0x00000000)  
  5. (不知道网络类型)  
  6.   
  7. public static final int NETWORK_TYPE_GPRS  
  8. Current network is GPRS  
  9. Constant Value: 1 (0x00000001)  
  10. (2.5G)移动和联通  
  11.   
  12. public static final int NETWORK_TYPE_EDGE  
  13. Current network is EDGE  
  14. Constant Value: 2 (0x00000002)  
  15. (2.75G)2.5G到3G的过渡    移动和联通  
  16.   
  17. public static final int NETWORK_TYPE_UMTS  
  18. Current network is UMTS  
  19. Constant Value: 3 (0x00000003)  
  20. (3G)联通  
  21.   
  22. -----------------Added in API level 4---------------------  
  23. public static final int NETWORK_TYPE_CDMA  
  24. Current network is CDMA: Either IS95A or IS95B  
  25. Constant Value: 4 (0x00000004)  
  26. (2G 电信)  
  27.   
  28. public static final int NETWORK_TYPE_EVDO_0  
  29. Current network is EVDO revision 0  
  30. Constant Value: 5 (0x00000005)  
  31. ( 3G )电信  
  32.   
  33. public static final int NETWORK_TYPE_EVDO_A  
  34. Current network is EVDO revision A  
  35. Constant Value: 6 (0x00000006)  
  36. (3.5G) 属于3G过渡  
  37.   
  38. public static final int NETWORK_TYPE_1xRTT  
  39. Current network is 1xRTT  
  40. Constant Value: 7 (0x00000007)  
  41. ( 2G )  
  42.   
  43. ---------------------Added in API level 5--------------------  
  44. public static final int NETWORK_TYPE_HSDPA  
  45. Current network is HSDPA  
  46. Constant Value: 8 (0x00000008)  
  47. (3.5G )  
  48.   
  49. public static final int NETWORK_TYPE_HSUPA  
  50. Current network is HSUPA  
  51. Constant Value: 9 (0x00000009)  
  52. 3.5G )  
  53.   
  54. public static final int NETWORK_TYPE_HSPA  
  55. Current network is HSPA  
  56. Constant Value: 10 (0x0000000a)  
  57. ( 3G )联通  
  58.   
  59. --------------------------Added in API level 8-------------------------  
  60. public static final int NETWORK_TYPE_IDEN  
  61. Current network is iDen  
  62. Constant Value: 11 (0x0000000b)  
  63. (2G )  
  64.   
  65. --------------------------Added in API level 9-------------------------  
  66. public static final int NETWORK_TYPE_EVDO_B  
  67. Current network is EVDO revision B  
  68. Constant Value: 12 (0x0000000c)  
  69. 3G-3.5G  
  70.   
  71. --------------------------Added in API level 11------------------------  
  72. public static final int NETWORK_TYPE_LTE  
  73. Current network is LTE  
  74. Constant Value: 13 (0x0000000d)  
  75. (4G)  
  76.   
  77. public static final int NETWORK_TYPE_EHRPD  
  78. Current network is eHRPD  
  79. Constant Value: 14 (0x0000000e)  
  80. 3G(3G到4G的升级产物)  
  81.   
  82.   
  83. --------------------------Added in API level 13---------------------------  
  84. public static final int NETWORK_TYPE_HSPAP  
  85. Current network is HSPA+  
  86. Constant Value: 15 (0x0000000f)  
  87. ( 3G )  
		--------------------Added in API level 1---------------------
		public static final int NETWORK_TYPE_UNKNOWN
		Network type is unknown
		Constant Value: 0 (0x00000000)
		(不知道网络类型)

		public static final int NETWORK_TYPE_GPRS
		Current network is GPRS
		Constant Value: 1 (0x00000001)
		(2.5G)移动和联通
		
		public static final int NETWORK_TYPE_EDGE
		Current network is EDGE
		Constant Value: 2 (0x00000002)
		(2.75G)2.5G到3G的过渡    移动和联通
		
		public static final int NETWORK_TYPE_UMTS
		Current network is UMTS
		Constant Value: 3 (0x00000003)
		(3G)联通
		
		-----------------Added in API level 4---------------------
		public static final int NETWORK_TYPE_CDMA
		Current network is CDMA: Either IS95A or IS95B
		Constant Value: 4 (0x00000004)
		(2G 电信)
		
		public static final int NETWORK_TYPE_EVDO_0
		Current network is EVDO revision 0
		Constant Value: 5 (0x00000005)
		( 3G )电信

		public static final int NETWORK_TYPE_EVDO_A
		Current network is EVDO revision A
		Constant Value: 6 (0x00000006)
		(3.5G) 属于3G过渡
		
		public static final int NETWORK_TYPE_1xRTT
		Current network is 1xRTT
		Constant Value: 7 (0x00000007)
		( 2G )
		
		---------------------Added in API level 5--------------------
		public static final int NETWORK_TYPE_HSDPA
		Current network is HSDPA
		Constant Value: 8 (0x00000008)
		(3.5G )
		
		public static final int NETWORK_TYPE_HSUPA
		Current network is HSUPA
		Constant Value: 9 (0x00000009)
		( 3.5G )
		
		public static final int NETWORK_TYPE_HSPA
		Current network is HSPA
		Constant Value: 10 (0x0000000a)
		( 3G )联通
		
		--------------------------Added in API level 8-------------------------
		public static final int NETWORK_TYPE_IDEN
		Current network is iDen
		Constant Value: 11 (0x0000000b)
		(2G )
		
		--------------------------Added in API level 9-------------------------
		public static final int NETWORK_TYPE_EVDO_B
		Current network is EVDO revision B
		Constant Value: 12 (0x0000000c)
		3G-3.5G
		
		--------------------------Added in API level 11------------------------
		public static final int NETWORK_TYPE_LTE
		Current network is LTE
		Constant Value: 13 (0x0000000d)
		(4G)
		
		public static final int NETWORK_TYPE_EHRPD
		Current network is eHRPD
		Constant Value: 14 (0x0000000e)
		3G(3G到4G的升级产物)
		
		
		--------------------------Added in API level 13---------------------------
		public static final int NETWORK_TYPE_HSPAP
		Current network is HSPA+
		Constant Value: 15 (0x0000000f)
		( 3G )

 所以我们可以networkInfo.getSubtype()得到值和上面的进行对应,就知道目前是几G网络了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值