有时候我们需要写一个程序来监听网络的变化,以实现即时刷新的问题,比如微信或者QQ都有自动重连的功能。单纯的用广播接收和ConnectivityManager难以实现,因为每次我们切换g网和wifi或者启用一个网络,系统都会发送多次网络变化的广播,如果我们把业务逻辑放在广播接收器里面处理,就会不必要的调用多次。比如当我们启动wifi时,系统将发送多次广播,当我们判断是否有网络连接的时候,会多次判断有网络(如果刚刚启动数据流量或者wifi)。这样里面的代码就会重复执行。想了各种办法,最终想到的解决方案如下。就是设置一个标记变量,稍微看一下就明白了:
package com.example.mywork; import java.util.Date; import java.util.Timer; import java.util.TimerTask; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.ConnectivityManager; import android.net.NetworkInfo; public class InternetState { private boolean update = false; private Date lastConnTime; OnInternetListener internetListener; Context context; protected void setInternetListener(OnInternetListener listener,Context context) { internetListener = listener; if(internetListener==null||context==null) return ; IntentFilter filter = new IntentFilter(); filter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); context.registerReceiver(new NetState(), filter); } private class NetState extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo gprs = connManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); NetworkInfo wifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); NetworkInfo info = connManager.getActiveNetworkInfo(); if(!update&&(wifi.isConnected()||gprs.isConnected()))//有网但是还没刷新 { update = true; System.out.println("111111111111111"); } else if(!wifi.isConnected()&&!gprs.isConnected())//没网 { update = false; } } } }
时间: 2024-10-25 16:55:19