編輯:關於Android編程
現在app大多都需要從網絡上獲得數據。所以訪問網絡是在所難免。但是再訪問網絡之前,我們應該先做一下網絡的狀態判斷。其實在訪問網絡之前我們要做一些狀態判斷,對應一些狀態判斷來做處理,並不是直接使用Http訪問網絡即可。很多人在開發就經常把網絡這塊直接跳過,直接訪問網絡,可以一斷網,各種體驗效果不好,不是說app沒法用,只是體驗效果差。還有,就是我們可能為用戶考慮,因為現在一般連網是wifi和手機流量,都知道後者收費是比較高的。假如我們的app加載的圖片或者有大的數據下載操作,可是用戶的本意是要是在流量下的話就不要操作這些很費流量的的操作,這樣就必須要我們做一些連網狀態的判斷。網絡是否連接良好,連接的wifi還是流量,斷網或者網絡改變了的時候怎麼做,這都是一些細節,但是要注意處理。
我們在做訪問的時候都得進行判斷是否連網。判斷連網也比較簡單,就用到了兩個類。ConnectivityManager和NetworkInfo。
只要執行下面的代碼就可以了。
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就是網絡的信息。還有一種更簡便的判斷是否連網的方法。
ConnectivityManager connMgr = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
在一個就是監聽網絡變化,就是設置一個廣播。
注冊廣播,監聽ConnectivityManager.CONNECTIVITY_ACTION這個action
IntentFilter filter = new IntentFilter( ConnectivityManager.CONNECTIVITY_ACTION); receiver = new NetworkReceiver(); context.registerReceiver(receiver, filter);
再實現一個廣播類就可以了。這樣網絡一變化,就會受到廣播,然後執行對應操作了。
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個狀態值:
下面是通過自己查資料,和看別人查資料實驗得來的。整理如下:
--------------------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網絡了。由於手裡的手機卡有限,所以有些不全,歡迎大家補充,共享。
Android屏幕適配出現的原因在我們學習如何進行屏幕適配之前,我們需要先了解下為什麼Android需要進行屏幕適配。由於Android系統的開放性,任何用戶、開發者、O
Android ListView添加頭布局和腳布局之前學習喜馬拉雅的時候做的一個小Demo,貼出來,供大家學習參考;如果我們當前的頁面有多個接口、多種布局的話,我們一般的
在用Android Studio開發的過程中,一遇到廢棄、不被推薦的方法和類,我就想做點什麼去掉上面的橫線。然後,被一個不是問題的問題困擾了很久。之前我們在創建固定Tab
本教程為大家分享了Android日歷庫的使用方法,供大家參考,具體內容如下MainActivity.java代碼:package siso.weekv;import an