在Android中监控多个片段中的互联网连接
我正在使用BroadcastReceiver监视internet连接的可能变化:在Android中监控多个片段中的互联网连接,android,broadcastreceiver,Android,Broadcastreceiver,我正在使用BroadcastReceiver监视internet连接的可能变化: public class NetworkChangeReceiver extends BroadcastReceiver 现在,我需要分别检查ViewPager中的每个片段。因为如果用户连接,那么这将分别反映在每个片段的UI上 如果我假设一次创建的片段的最大数量为3,那么我的问题是: 为每个片段分别定义一个NetworkChangeReceiver实例是否危险,或者我应该只定义一个?也许您可以在onReceiv
public class NetworkChangeReceiver extends BroadcastReceiver
现在,我需要分别检查ViewPager中的每个片段。因为如果用户连接,那么这将分别反映在每个片段的UI上
如果我假设一次创建的片段的最大数量为3,那么我的问题是:
为每个片段分别定义一个NetworkChangeReceiver实例是否危险,或者我应该只定义一个?也许您可以在
onReceive
中添加一个静态布尔值变量集(true
当连接打开时,否则false
)并在onCreateView
或onResume
中检索不同片段的值 您可以简单地将观察者模式
结构应用于您的问题
首先,您需要定义一个内部类,该类必须可以被片段观察到
我将粘贴一些代码片段来说明如何应用
这是networkchangerecever
和NetworkObservable
类
public class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, final Intent intent) {
Log.d("NetworkChangeReceiver","Connection status changed");
getObservable().connectionChanged();
}
public static class NetworkObservable extends Observable{
private static NetworkObservable instance = null;
private NetworkObservable() {
// Exist to defeat instantiation.
}
public void connectionChanged(){
setChanged();
notifyObservers();
}
public static NetworkObservable getInstance(){
if(instance == null){
instance = new NetworkObservable();
}
return instance;
}
}
public static NetworkObservable getObservable() {
return NetworkObservable.getInstance();
}
}
此外,您需要为广播接收器设置清单。以下是您如何做到这一点:
<receiver android:name="com.your.package.name.NetworkChangeReceiver" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
</intent-filter>
</receiver>
您还可以通过向notiftyobserver()
方法添加任何参数来传递网络状态
希望这能有所帮助。谢谢gokhanakkurt的回答,但我不知道为什么在我将“可观察”对象设置为单例之前,还没有调用“更新”函数
public class NetworkStateReceiver extends BroadcastReceiver
{
private static NetworkObservable observable;
public void onReceive(Context context, Intent intent)
{
getObservable().connectionChanged();
}
public static class NetworkObservable extends Observable
{
public void connectionChanged()
{
setChanged();
notifyObservers();
}
}
public static NetworkObservable getObservable()
{
if(observable == null)
{
observable = new NetworkObservable();
}
return observable;
}
}
在我的片段中:
NetworkStateReceiver.getObservable().addObserver(this);
如果我是正确的,希望你检查并修改你的答案,如果你是正确的,请澄清。无论如何,您的答案仍然被接受。我已经按照以下方式完成了此操作,效果良好
FirstFragment.java
public class FirstFragment extends Fragment {
public static int TYPE_WIFI = 1;
public static int TYPE_MOBILE = 2;
public static int TYPE_NOT_CONNECTED = 0;
TextView noInternetView;
private BroadcastReceiver myReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String status = getConnectivityStatusString(context);
if(status.equals("No")) {
noInternetView.setVisibility(View.VISIBLE);
} else {
noInternetView.setVisibility(View.GONE);
}
}
};
public static String getConnectivityStatusString(Context context) {
int conn = getConnectivityStatus(context);
String status = null;
if (conn == TYPE_WIFI) {
status = "Wifi";//"Wifi enabled";
} else if (conn == TYPE_MOBILE) {
status = "Mobile";//"Mobile data enabled";
} else if (conn == TYPE_NOT_CONNECTED) {
status = "No";//"Not connected to Internet";
}
return status;
}
public static int getConnectivityStatus(Context context) {
ConnectivityManager cm = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
if (null != activeNetwork) {
if(activeNetwork.getType() == ConnectivityManager.TYPE_WIFI)
return TYPE_WIFI;
if(activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE)
return TYPE_MOBILE;
}
return TYPE_NOT_CONNECTED;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.first_fragment, container, false);
IntentFilter filter = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
getActivity().registerReceiver(myReceiver, filter);
noInternetView = (TextView)rootView.findViewById(R.id.nointernet);
.......
.......
return rootView;
}
public void onDestroyView() {
super.onDestroyView();
getActivity().getApplicationContext().unregisterReceiver(myReceiver);
}
}
第一个片段.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/rootLayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#DFE6F5"
android:orientation="vertical" >
<TextView
android:id="@+id/nointernet"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:textColor="#FFFFFF"
android:textSize="8pt"
android:text="No internet connection!"
android:background="#FF0000"
android:gravity="center"/>
</RelativeLayout>
你的代码和我的不一样。如果在每次调用getObservable()时返回一个新对象,则该对象将不起作用。因为每个实例都有不同的观察者。因此,不会调用update。在您的例子中,您必须有一个可观察对象(不超过一个),它必须是通知注册观察者的单例对象或静态对象。我将编辑您的代码块。但在我的情况下,它是一个单例,并且可以正常工作。你是说你想编辑你的代码块吗?我是说我看到你的代码有漏洞。实际上,默认情况下,您仍然可以创建NetworkObservable对象。您必须阻止代码执行此操作。但另一个是好的。完全正确。现在让我问你,在onDestry()方法中不删除我自己可以吗?作为观察者添加的片段应该被销毁,互联网连接状态也发生了变化,但没有给我任何错误。我只是想确定一下。不,这是内存泄漏,兄弟,你也必须处理这个问题,因为你的应用程序在后台时会抛出异常。我将编辑我的答案。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/rootLayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#DFE6F5"
android:orientation="vertical" >
<TextView
android:id="@+id/nointernet"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:textColor="#FFFFFF"
android:textSize="8pt"
android:text="No internet connection!"
android:background="#FF0000"
android:gravity="center"/>
</RelativeLayout>