android - 在 Android 的许多 fragment 中监控互联网连接

标签 android broadcastreceiver

我正在使用 BroadcastReceiver 来监控互联网连接的可能变化:

public class NetworkChangeReceiver extends BroadcastReceiver 

现在,我需要分别检查 ViewPager 中的每个 fragment 。因为如果用户建立连接,那么这将分别反射(reflect)在每个 fragment 的 UI 上。

如果我假设一次创建的 fragment 的最大数量是三个,那么我的问题是:

为每个 fragment 定义一个 NetworkChangeReceiver 实例以单独工作是否危险,或者我应该只定义一个?

最佳答案

您可以简单地将观察者模式结构应用于您的问题。

首先,您需要定义一个必须由 Fragment 观察到的内部类。

我将粘贴一些代码 fragment 来说明如何应用。

这是 NetworkChangeReceiverNetworkObservable 类。

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();
    }
}

此外,您需要为广播接收器设置您的 list 。方法如下:

<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>

每当您的连接发生变化时,onReceive 方法都会被隐式调用。因此,您需要调用一个通知所有观察者的方法。

对于您的情况,观察者将是 Fragment 类。

我将粘贴另一个代码块来显示示例观察者类。

/*
* If you have memory concerns,
* you need to add your observer while application is resuming
* you need to remove that observer object while application is pausing...
* 
*/
public class FirstFragment extends Fragment implements Observer{        
    @Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
    } 

    @Override
    public void onPause() {
      super.onPause();
      NetworkChangeReceiver.getObservable().deleteObserver(this);
    }

    @Override
    public void onResume() {
      super.onResume();
      NetworkChangeReceiver.getObservable().addObserver(this);
    }

    @Override
    public void update(Observable observable, Object data) {
        // Whenever connection changes, this method will be called so edit your text here
    }
}

您还可以通过向 notiftyObservers() 方法添加任何参数来传递网络状态。

希望这可能有所帮助。

关于android - 在 Android 的许多 fragment 中监控互联网连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21480802/

相关文章:

android - 从其他应用程序启动 Activity ?

java - 未收到广播[LocalBroadcastManager] Android

java - 如何加密我的 config.raw 文件以避免任何类型的攻击?

android - 如何在 Android 上检查 Open Mobile API 的版本?

带广播接收器的 Android 警报管理器

android - 在广播接收器中优先接听电话

android - Sms BroadCastReceiver 泄漏内存

android - 来电时如何区分屏幕亮灭状态?

java - 如何将 DatePicker 设置为当前日期后一个月?

android - GCM - Android 模拟器上的 PHONE_REGISTRATION_ERROR