网络连接与判断

转载 2015年07月10日 17:58:43

现在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();  


 

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

  1. ConnectivityManager connMgr = (ConnectivityManager) context  
  2.                 .getSystemService(Context.CONNECTIVITY_SERVICE);  
  3.         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);  


 

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

  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.     }  


下面就是来说一下判断手机网络的类型了,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 )  

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

安卓开发-判断网络连接状态

  • 2015年12月12日 01:17
  • 23KB
  • 下载

android判断网络连接

  • 2016年10月21日 10:29
  • 1.45MB
  • 下载

android(java) socket判断网络连接状态

在 android socket 编程中我们需要时刻对其网络状态进行判断,android(java)对网络状态判断的方法(isClosed(),isConnected(),isInputShutdow...
  • yudajun
  • yudajun
  • 2013年08月19日 11:04
  • 15102

android 腾讯定位并判断网络连接

  • 2015年08月13日 21:48
  • 2.05MB
  • 下载

Android网络连接判断

获取网络信息需要在AndroidManifest.xml文件中加入相应的权限。 (工具类)定义一个类 NetstateUtil 1)判断是否有网络连接 ...

iOS网络连接状态判断 JPNetwork

  • 2013年12月26日 22:17
  • 2KB
  • 下载

判断Android客户端网络连接状态

  • 2015年01月08日 11:27
  • 281B
  • 下载

iOS开发——网络连接判断

iOS开发必然会涉及网络操作,作为优化用户体验的第一步,在请求网络前,往往首先需要判断客户端是否连接网络,并给用户提示。然后用户才会去进行打开网络或连接WiFi等操作。下面我将会使用苹果提供的Reac...

android判断网络连接

  • 2012年11月25日 21:32
  • 936KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:网络连接与判断
举报原因:
原因补充:

(最多只允许输入30个字)