我写了一个NetworkStateReceiver来检查互联网状态&通过事件总线将该意图发布到Activity。
public class NetworkStateReceiver extends BroadcastReceiver {
private static final String TAG = "NetworkStateReceiver";
NetworkEvent networkEvent = null;
@Override
public void onReceive(final Context context, final Intent intent) {
LogMe.e(TAG, "Network connectivity change");
if (intent.getExtras() != null && intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
if (Connectivity.isConnected(context)) {
LogMe.i(TAG, "Network " + Connectivity.getNetworkInfo(context) + " connected");
networkEvent = new NetworkEvent(NetworkEvent.INTERNET_CONNECTED, true);
EventBus.getDefault().post(networkEvent);
} else {
LogMe.i(TAG, "Network " + Connectivity.getNetworkInfo(context) + " not connected");
networkEvent = new NetworkEvent(NetworkEvent.INTERNET_GONE, false);
EventBus.getDefault().post(networkEvent);
}
}
}
}
在活动中我已注册的赛事总线 onStart ,并在 onPause 中取消注册。
@Override
protected void onResume() {
super.onResume();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
broadcastReceiver = new NetworkStateReceiverActivity();
registerReceiver(broadcastReceiver, intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
}
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
protected void onPause() {
super.onPause();
EventBus.getDefault().unregister(this);
unregisterReceiver(broadcastReceiver);
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onNetworkEvent(NetworkEvent event) {
textView_internet.setText("" + event.isNetworkStateChanged());
if (event.getTAG() == NetworkEvent.INTERNET_CONNECTED) {
if (event.isNetworkStateChanged()) {
LogMe.i(TAG, "Has Internet ....");
Snackbar.make(getWindow().getDecorView().getRootView(), "Has internet ", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
} else if (event.getTAG() == NetworkEvent.INTERNET_GONE) {
if (!event.isNetworkStateChanged()) {
LogMe.i(TAG, "No Internet ....");
Snackbar.make(getWindow().getDecorView().getRootView(), "No internet", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
}
}
但问题是通过互联网连接或不连接的所有时间。我想在用户改变网络状态时调用Eventbus,而不是在创建活动的所有时间。如何摆脱这种局面?我还在活动中仅测试了广播接收器,但每次创建活动时都收到广播。
答案 0 :(得分:0)
好的,我们这里有几件事
isNetworkStateChanged()
的实施并不完全正确。因为基本上每次您的活动都是resumed
,您就会创建一个新的BroadcastReceiver
实例,对于此实例,第一次将始终被视为网络更改,即使实际上并非如此案件。
您需要使用当前网络状态初始化BroadcastReceiver
-in构造函数获取当前网络状态并设置为默认值 - 或者在首次注册接收器时找到另一种不做错误更改的方法。
BroadcastReceiver
中的逻辑也不完全正确。您正在考虑将connected
视为网络更改,而将not connected
视为网络更改。您需要根据最后连接状态是否与您获得的状态相同来设置网络更改标志。基本上,你需要像
这样的东西new NetworkEvent(.., lastConnectionState == newConnectionState);