在Android中监控多个片段中的互联网连接

在Android中监控多个片段中的互联网连接,android,broadcastreceiver,Android,Broadcastreceiver,我正在使用BroadcastReceiver监视internet连接的可能变化: public class NetworkChangeReceiver extends BroadcastReceiver 现在,我需要分别检查ViewPager中的每个片段。因为如果用户连接,那么这将分别反映在每个片段的UI上 如果我假设一次创建的片段的最大数量为3,那么我的问题是: 为每个片段分别定义一个NetworkChangeReceiver实例是否危险,或者我应该只定义一个?也许您可以在onReceiv

我正在使用BroadcastReceiver监视internet连接的可能变化:

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>