【问题标题】:LocationManager.removeUpdates(listener) not removing location listenerLocationManager.removeUpdates(listener) 不删除位置监听器
【发布时间】:2012-09-17 11:15:30
【问题描述】:

我的应用场景是我想跟踪员工的位置。我有一个广播接收器,它监听设备启动广播并注册一个警报管理器。当警报管理器滴答作响时,它会注册两个位置侦听器,一个用于侦听 gps,另一个用于网络。我希望当我在 onLocationChange() 方法中获得第一次位置更新时,保存位置并取消注册该位置侦听器,以便当警报管理器再次滴答声时,它不会重复。要取消注册,我将位置侦听器作为静态对象在 onLocationChange() 中访问它们。但我发现它并没有删除位置监听器。这是我的代码示例:

 public class BootTimeServiceActivator extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        Calendar calendar = Calendar.getInstance();
        AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        Intent mIntent = new Intent(context, MyBroadCastReceiver.class);
        PendingIntent mPendingIntent = PendingIntent.getBroadcast(context, 0, mIntent, PendingIntent.FLAG_CANCEL_CURRENT);
        am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 20 * 60 * 1000, mPendingIntent);


    }

    }

//..........

    public class MyBroadCastReceiver extends BroadcastReceiver{

    public static LocationManager locationManager;
    public static MyLocationListener networkLocationListener;
    public static MyLocationListener gpsLocationListener;



    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        Toast.makeText(context, "Alarm has been called...", Toast.LENGTH_SHORT).show();
        initLocationListeners(context);
        registerLocationListeners();

    }

    public void initLocationListeners(Context context) {
        locationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
        networkLocationListener = new MyLocationListener(context);
        gpsLocationListener = new MyLocationListener(context);

    }

    public void registerLocationListeners() {
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 100, 0, gpsLocationListener);
        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 100, 0, gpsLocationListener);

    }

}

\\.....

    public class MyLocationListener implements LocationListener {

    Context context;

    public MyLocationListener(Context context) {
        this.context = context;
    }

    @Override
    public void onLocationChanged(Location location) {
        if(location != null) {
            SDCardService sdService = new SDCardService(context);
            try {
                sdService.logToDB(location);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            Log.d("provider",location.getProvider());
            if(location.getProvider().equals(LocationManager.GPS_PROVIDER)) {
                MyBroadCastReceiver.locationManager.removeUpdates(MyBroadCastReceiver.gpsLocationListener);
            }
            else if(location.getProvider().equals(LocationManager.NETWORK_PROVIDER)) {
                MyBroadCastReceiver.locationManager.removeUpdates(MyBroadCastReceiver.networkLocationListener);
            }



        }


    }

谁能指导我哪里错了?

【问题讨论】:

    标签: android locationlistener


    【解决方案1】:

    试试这个..

    lmNetwork.removeUpdates(networkLocationListener);
    lmGps.removeUpdates(gpsLocationListener);
    

    【讨论】:

      【解决方案2】:

      啊...我有一个拼写错误。实际上,在 MyBroadCastREciever 类中,我将 gpsListener 注册了两次:

      locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 
          100, 0, 
          gpsLocationListener);
      
      locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 
          100, 0, 
          networkLocationListener); //previously was gpsLocationListener again. Wrong.
      

      那是你的网络监听器没有被删除。

      【讨论】:

      • 那你做了什么修改?就像您删除网络侦听器一样,您将无法获得网络更新。
      【解决方案3】:

      您可以使用内部类来执行此操作并删除监听器 onPause() :

              @Override
              protected void onPause() {
                      super.onPause();
                      GPSlocationManager.removeUpdates(GPSLocationListener);
                      CellLOcationManager.removeUpdates(NetworkLocationListener);
              }
      
              private void SetLocationManager() {
                      GPSlocationManager =(LocationManager)getSystemService(Context.LOCATION_SERVICE);
                      CellLOcationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
                      NetworkLocationListener = new MyNetworkLocationListener();
                      GPSLocationListener = new MyGPSLocationListener();
                      GPSlocationManager.requestLocationUpdates("gps", 5000, 1, GPSLocationListener);
                      CellLOcationManager.requestLocationUpdates("network", 10000, 1, NetworkLocationListener);
              }
      
              private class MyNetworkLocationListener implements LocationListener {
      
                      @Override
                      public void onLocationChanged(Location location) {
      
                      }
      
                      @Override
                      public void onStatusChanged(String s, int i, Bundle bundle) {
                      }
      
                      @Override
                      public void onProviderEnabled(String s) {
                      }
      
                      @Override
                      public void onProviderDisabled(String s) {
                      }
      
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-23
        相关资源
        最近更新 更多