开发遇到的网络判断思路:
不能每次网络请求都要去调用ConnectivityManager进行网络判断,所以在程序启动的时候判断一次网络状态,然后全局记录这个状态,每次网络请求的时候只用根据这个记录的状态来判断网络的连接状态即可,只有当人为的关闭网络或者切换网络的时候才改变全局的记录状态,这个改变使用到广播。
广播收听网络改变状态:
- package com.huiting.receiver;
- import android.content.BroadcastReceiver;
- import android.content.Context;
- import android.content.Intent;
- import android.net.ConnectivityManager;
- import android.net.NetworkInfo.State ;
- import com.huiting.application.BaseApplication;
- import com.huiting.tools.LogUtils;
- /**
- * 网络改变监控广播
- *
- * 监听网络的改变状态,只有在用户操作网络连接开关(wifi,mobile)的时候接受广播,然后对相应的界面进行相应的操作
- * 适用于下载时候,听音乐过程中
- *
- * Created by zst on 16/1/27.
- */
- public class NetworkChangeReceiver extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- State wifiState = null;
- State mobileState = null;
- ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
- wifiState = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();
- mobileState = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState();
- LogUtils.d("网络改变(NetworkChangeReceiver)", "wifi状态:" + wifiState + "\n mobile状态:" + mobileState);
- if (wifiState != null && mobileState != null
- && State.CONNECTED != wifiState
- && State.CONNECTED == mobileState) {// 手机网络连接成功
- LogUtils.d("网络改变(NetworkChangeReceiver)", "手机2g/3g/4g网络连接成功");
- BaseApplication.getInstance().setIsMobile(true);
- BaseApplication.getInstance().setIsWifi(false);
- BaseApplication.getInstance().setIsNetworkConn(true);
- } else if (wifiState != null && State.CONNECTED == wifiState) {// 无线网络连接成功
- LogUtils.d("网络改变(NetworkChangeReceiver)", "无线网络连接成功");
- BaseApplication.getInstance().setIsMobile(false);
- BaseApplication.getInstance().setIsWifi(true);
- BaseApplication.getInstance().setIsNetworkConn(true);
- } else if (wifiState != null && mobileState != null
- && State.CONNECTED != wifiState
- && State.CONNECTED != mobileState) {// 手机没有任何的网络
- LogUtils.d("网络改变(NetworkChangeReceiver)", "手机没有任何的网络");
- BaseApplication.getInstance().setIsMobile(false);
- BaseApplication.getInstance().setIsWifi(false);
- BaseApplication.getInstance().setIsNetworkConn(false);
- }
- }
- }
Application记录状态,启动app时候这里也进行一次网络判断和记录:
- /**
- * 当前应用程序
- * 必须在AndroidManifest.xml中写在application中
- * Created by zst on 15/12/17.
- */
- public class BaseApplication extends Application {
- //固定值-使用private防止别的程序修改这些值,然后使用下面的public方法向外边提供这些值,static一般是不需要二次修改的
- private static BaseApplication application;
- private static int mainTid;//程序运行线程id
- private static Handler handler;
- private static TelephonyManager telephonyManager;//设备标示符
- //网路连接
- private boolean isWifi;//wifi是否连接
- private boolean isMobile;//手机是否连接
- private boolean isNetworkConn;//是否有网