通知网络变更的活动 - Android电子 [英] Notify Activity of Network Change - Android

查看:129
本文介绍了通知网络变更的活动 - Android电子的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有需要执行一次到网络的连接已经建立的操作的活动。我试图实现Observer模式,但我得到一个NullPointerException异常,当我尝试注册的观察活动的主题。有什么想法?

NetworkStatus

 公共类NetworkStatus实现NetworkStatusSubject,Runnable接口{    清单< NetworkObserver> observerList;
    上下文语境;
    公共NetworkStatus(上下文的背景下){
        this.context =背景;
    }    公共静态布尔isConnectedToInternet(上下文的背景下){        布尔haveConnectedWifi = FALSE;
        布尔haveConnectedMobile = FALSE;        ConnectivityManager厘米=(ConnectivityManager)context.getSystemService(context.CONNECTIVITY_SERVICE);
        的NetworkInfo [] = NetInfo的cm.getAllNetworkInfo();
        对于(NI的NetworkInfo:NetInfo的){
            如果(ni.getTypeName()。equalsIgnoreCase(WIFI))
                如果(ni.isConnected())
                    haveConnectedWifi = TRUE;
            如果(ni.getTypeName()。equalsIgnoreCase(手机))
                如果(ni.isConnected())
                    haveConnectedMobile = TRUE;
        }
        返回haveConnectedWifi || haveConnectedMobile;
    }    / **
     *添加观察员名单
     * /
    @覆盖
    公共无效的addObserver(NetworkObserver O){
        observerList.add(O);    }    / **
     *从列表中删除观察
     * /
    @覆盖
    公共无效removeObserver(NetworkObserver O){
        observerList.remove(O);
    }    @覆盖
    公共无效notifyObservers(){
        对于(NetworkObserver networkObserver:observerList){
            networkObserver.updateStatus();
        }
    }    @覆盖
    公共无效的run(){        而(真){
            Log.d(NetworkStatus,检查网络状态);
            如果(isConnectedToInternet(上下文)){
                notifyObservers();
                Log.d(NetworkStatus,建立网络连接);
            }
            其他{
                Log.d(NetworkStatus,未连接到网络);
            }
            尝试{
                视频下载(10000);
            }赶上(InterruptedException的E){
                // TODO自动生成catch块
                e.printStackTrace();
            }
        }    }
}

活动,需要通知

 公共类OfflineActivity扩展活动实现NetworkObserver {    公众的GeoPoint ourLocationGeoPoint;    @覆盖
    保护无效的onCreate(捆绑savedInstanceState){
        // TODO自动生成方法存根
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.offline_mode_layout);        //注册网络状态更新
        NetworkStatus networkStatus =新NetworkStatus(本);
        networkStatus.addObserver(新OfflineActivity());
        networkStatus.run();        //获取对系统的位置管理的参考
        的LocationManager的LocationManager =(的LocationManager)本
                .getSystemService(Context.LOCATION_SERVICE);        //定义,响应位置更新的监听器
        LocationListener的LocationListener的=新LocationListener的(){            公共无效onLocationChanged(地点){
                //当一个新的位置由网络位置发现被叫
                //提供商。
                / **
                 *保存位置来的GeoPoint
                 * /
                INT纬度=(INT)(location.getLatitude()* 1E6);
                INT LNG =(INT)(location.getLongitude()* 1E6);
                ourLocationGeoPoint =新的GeoPoint(纬度,经度);
            }            公共无效onStatusChanged(字符串提供商,INT状态,
                    捆绑演员){
            }            公共无效onProviderEnabled(字符串提供商){
            }            公共无效onProviderDisabled(字符串提供商){
            }
        };
        对于(字符串提供商:locationManager.getAllProviders()){
            //注册的位置管理器监听接收
            //位置更新
            locationManager.requestLocationUpdates(提供商,0,0,
                    LocationListener的);
        }
    }
    @覆盖
    公共无效updateStatus(){        Log.d(OfflineActivity,已建立连接,上传分数!);    }
}


解决方案

observerList 被声明为实例变量,但从来没有实例化。

实例化,构造函数是一个很好的地方:

 公共NetworkStatus(上下文的背景下){
        this.context =背景;
        observerList =新的List< NetworkObserver> ();
    }

I have an activity which needs to perform an operation once a connection to a network has been established. I tried implementing the Observer pattern but am getting a NullPointerException when I try to register the Observer activity to the subject. Any thoughts?

NetworkStatus

public class NetworkStatus implements NetworkStatusSubject, Runnable {

    List<NetworkObserver> observerList;
    Context context;
    public NetworkStatus(Context context) {
        this.context = context;
    }

    public static boolean isConnectedToInternet(Context context) {

        boolean haveConnectedWifi = false;
        boolean haveConnectedMobile = false;

        ConnectivityManager cm = (ConnectivityManager)context.getSystemService(context.CONNECTIVITY_SERVICE);
        NetworkInfo[] netInfo = cm.getAllNetworkInfo();
        for (NetworkInfo ni : netInfo) {
            if (ni.getTypeName().equalsIgnoreCase("WIFI"))
                if (ni.isConnected())
                    haveConnectedWifi = true;
            if (ni.getTypeName().equalsIgnoreCase("MOBILE"))
                if (ni.isConnected())
                    haveConnectedMobile = true;
        }
        return haveConnectedWifi || haveConnectedMobile;
    }

    /**
     * Add observer to list
     */
    @Override
    public void addObserver(NetworkObserver o) {
        observerList.add(o);

    }

    /**
     * Remove Observer from list
     */
    @Override
    public void removeObserver(NetworkObserver o) {
        observerList.remove(o);
    }

    @Override
    public void notifyObservers() {
        for(NetworkObserver networkObserver :  observerList) {
            networkObserver.updateStatus();
        }
    }

    @Override
    public void run() {

        while(true) {
            Log.d("NetworkStatus", "Checking Network Status");
            if(isConnectedToInternet(context)){
                notifyObservers();
                Log.d("NetworkStatus", "Network Connection is established");
            }
            else {
                Log.d("NetworkStatus", "Not connected to network");
            }
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }
}

Activity which needs notification

public class OfflineActivity extends Activity implements NetworkObserver {

    public GeoPoint ourLocationGeoPoint;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.offline_mode_layout);

        //Register for network status updates
        NetworkStatus networkStatus = new NetworkStatus(this);
        networkStatus.addObserver(new OfflineActivity());
        networkStatus.run();

        // Acquire a reference to the system Location Manager
        LocationManager locationManager = (LocationManager) this
                .getSystemService(Context.LOCATION_SERVICE);

        // Define a listener that responds to location updates
        LocationListener locationListener = new LocationListener() {

            public void onLocationChanged(Location location) {
                // Called when a new location is found by the network location
                // provider.
                /**
                 * Save Location to geopoint
                 */
                int lat = (int) (location.getLatitude() * 1E6);
                int lng = (int) (location.getLongitude() * 1E6);
                ourLocationGeoPoint = new GeoPoint(lat, lng);
            }

            public void onStatusChanged(String provider, int status,
                    Bundle extras) {
            }

            public void onProviderEnabled(String provider) {
            }

            public void onProviderDisabled(String provider) {
            }
        };
        for (String provider : locationManager.getAllProviders()) {
            // Register the listener with the Location Manager to receive
            // location updates
            locationManager.requestLocationUpdates(provider, 0, 0,
                    locationListener);
        }
    }
    @Override
    public void updateStatus() {

        Log.d("OfflineActivity", "Connection Established, Uploading Points!");

    }
}

解决方案

observerList is declared as an instance variable but never instantiated.

Instantiate it, the constructor is a good place for this:

public NetworkStatus(Context context) {
        this.context = context;
        observerList = new List <NetworkObserver> ();
    }

这篇关于通知网络变更的活动 - Android电子的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆