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