首页 > 代码库 > 解决网络监听多次发送广播的问题

解决网络监听多次发送广播的问题

有时候我们需要写一个程序来监听网络的变化,以实现即时刷新的问题,比如微信或者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;
	    }
	 }
  }
}


解决网络监听多次发送广播的问题