• 网络工具,通过该类可以直接监听网络状态改变


    package com.bearbaby.erp.staff.util;
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.net.ConnectivityManager;
    import android.net.NetworkInfo;
    import android.widget.Toast;
    
    import com.bearbaby.erp.staff.MyApplication;
    
    import java.util.ArrayList;
    import java.util.List;
    /**
     * Created by Administrator on 2017/4/19.
     */
    
    public class NetUtils {
        private static boolean netStateLink = true;
        private static boolean registered = false;//防止重复注册
        private static boolean showToasted = false;  //防止application和启动页面重复初始化后,没网络提示语的重复
        private static Context context;
        private static NetUtils instance;
        private static ConnectionChangeReceiver myNetReceiver;
        private static final String TAG = "NetUtils";
        private NetUtils() {
        }
        public static synchronized NetUtils getInstance() {    //对获取实例的方法进行同步
            if (instance == null)
                instance = new NetUtils();
            return instance;
        }
        //获得是否有网络连接
        public static boolean isnetStateLink() {
            LogUtil.i(TAG, "isnetStateLink:是否有网络?"+netStateLink);
            return netStateLink;
        }
        /**
         * 这个一定要调用一次
         * 否则应用无法联网一定要在网络请求之前调用
         *启动页面初始化就好 为了安全起见,application一定要调用,startup也要调用,
         * 因为用户返回键退出后,不会再走application的创建,(应用退出,但是不杀死进程不会走application的)
         * @param contexts 一定要是Context,不能是Activity的this
         */
        public static void init(Context contexts) {
            if (contexts != null) {
                context = contexts;
                ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
                NetworkInfo mobNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
                NetworkInfo wifiNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
                if (!mobNetInfo.isConnected() && !wifiNetInfo.isConnected()) {
                    netStateLink = false;
                    if (!showToasted){
                        Toast.makeText(context,"联网失败,请检查网络设置",Toast.LENGTH_SHORT) .show();
                        showToasted=true;
                    }
                    LogUtil.i(TAG, "isnetStateLink:  初始化网络状态没有网络连接.........");
                } else {
                    LogUtil.i(TAG, "isnetStateLink:  初始化网络状态有网络连接.........");
                    netStateLink = true;
                }
                if (!registered){
                    registerReceiver();//注册.......
                }
            }
        }
        /**
         * 注册网络监听
         */
        private static void registerReceiver() {
            LogUtil.i(TAG, " 注册网络监听registerReceiver.........");
            IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
            myNetReceiver = new ConnectionChangeReceiver();
            context.registerReceiver(myNetReceiver, filter);
            registered=true;
        }
        /**
         * 取消网络注册监听
         * 需要在应用最后一个页面销毁后注销(MainActivity退出后一定要调用),
         * 不然提示第一次进入后的联网失败,请检查网络设置,会重复
         */
        public static void unregisterReceiver() {
            LogUtil.i(TAG, " 反注册网络监听unregisterReceiver.........");
            if (registered){
                try {
                    if (context!=null){
                        context.unregisterReceiver(myNetReceiver);
                        LogUtil.i(TAG, " 成功反注册网络监听.........");
                        registered=false;
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    LogUtil.e(TAG, "异常反注册网络监听........."+e.getMessage());
                    registered=false;
                }
                registered=false;
            }
            showToasted=false;
        }
        static List<NetworkState> ln = new ArrayList();
        //网络状态监听
        static class ConnectionChangeReceiver extends BroadcastReceiver {
            @Override
            public void onReceive(Context context, Intent intent) {
                ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
                NetworkInfo mobNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
                NetworkInfo wifiNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
                if (!mobNetInfo.isConnected() && !wifiNetInfo.isConnected()) {
                        if (netStateLink) {
                            if ( MyApplication.getContext().isAppVisible()) {
                                ToastUtil.show("网络已断开!");
                                for (NetworkState ns : ln) {
                                    if (ns != null) {
                                        ns.disconnectNetwork();
                                    }
                                }
                            }
                        }
                    netStateLink = false;
                } else {
                        if (!netStateLink){
                            if ( MyApplication.getContext().isAppVisible()) {
                                ToastUtil.show("网络已恢复!");
                                //通知监听,如果不在前台不通知,防止有网络后,做其他网络操作退出回到登录页面
                                netStateLink = true;//这个必须要在回调前修改为true 因为接口后面可能会有网络操作,到时候任然无法请求
                                for (NetworkState ns : ln) {
                                    if (ns != null) {
                                        ns.connectedNetwork();
                                    }
                                }
                            }
                        }
                    netStateLink = true;
                }
            }
        }
        //添加网络监听和removeNetworkListen搭配
        public void addNetworkListen(NetworkState ns) {
            if (ns != null) {
                ln.add(ns);
            }
        }
        //网络状态监听回调接口
        public interface NetworkState {
            //连接上网络
            void connectedNetwork();
            //断开网络
            void disconnectNetwork();
        }
        //移除网络监听,和addNetworkListen搭配使用
        public synchronized void  en(NetworkState ns) {
            if (ns != null) {
                for (int i = 0; i < ln.size(); i++) {
                    if (ln.get(i) == ns) {
                        ln.remove(i);
                    }
                }
            }
        }
    }
  • 相关阅读:
    (转)ab(apachebench)测试与loadrunner
    hibernate学习总结
    Oracle 11G在用EXP 导入、导出时,若有空表对导入导出中遇到的问题的解决
    Nginx可以做什么
    Oracle的表空间、用户和表的区别和联系
    oracle11g 导出表报EXP-00011:table不存在。
    tomcat、nginx、apache、tengine都是什么,及其作用
    注解和依赖注入框架
    js中innerHTML与innerText的用法与区别
    Linux中 /boot 目录介绍
  • 原文地址:https://www.cnblogs.com/lizhanqi/p/7357380.html
Copyright © 2020-2023  润新知