【问题标题】:android locationManager continues to call onLocationChanged after removeUpdatesandroid locationManager 在 removeUpdates 后继续调用 onLocationChanged
【发布时间】:2012-12-04 16:26:45
【问题描述】:

我有一个可以修复位置的应用。该应用程序将从 Gingerbread 开始推广到手机上。一旦应用程序获得位置修复,就会向用户显示 toast 消息。问题是当用户移动到下一个活动时,toast 消息可能会出现十次以上。

我认为我已经正确实现了生命周期,例如

1) 在 onCreate() 中获取位置管理器 2) 在 onResume() 中创建一个位置监听器并将其传递给管理器 3) 删除 onStop() 中的更新

我知道我可以通过调用在 Android > 4.x 中绕过这个问题

mlocManager.requestSingleUpdate(LocationManager.GPS_PROVIDER, mlocListener, null);

但我必须适应 Gingerbread,所以调用单个请求不在 api 2.3.x 中。它在 Android 4 上运行良好,但在姜饼上,onLocationChanged 方法继续执行 10 次。

如何强制 onLocationChanged 方法在姜饼上只运行一次?

谢谢。

[编辑] 我注意到,当我移动到下一个活动时,onlocationchanged 方法会继续执行,但如果我移动到另一个活动,那么位置请求将被成功删除

@Override
protected void onStop() {
    mlocManager.removeUpdates(mlocListener); 
    mlocListener = null;
    super.onStop();
}

@Override
protected void onResume() {
    mlocListener = new MyLocationListener();
    if(isCompOptionsReceived == true){
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.GINGERBREAD_MR1) {
            mlocManager.requestSingleUpdate(LocationManager.GPS_PROVIDER, mlocListener, null);
        }else{
            mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mlocListener);   
        }
    }        
    super.onResume();
}

private class MyLocationListener implements LocationListener {

    @Override
    public void onLocationChanged(Location loc) {
        //toast message
    }

    @Override
    public void onProviderDisabled(String provider) {
    }

    @Override
    public void onProviderEnabled(String provider) {
    }

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

}//end of MyLocationListener

@Override
protected void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    nfcscannerapplication = (NfcScannerApplication) getApplication();
    sIs = savedInstanceState;
    setContentView(R.layout.entryscreen);
    mlocManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

【问题讨论】:

标签: android gps location


【解决方案1】:

下面的代码应该在onPause方法上执行,而不是在onStop中

mlocManager.removeUpdates(mlocListener); 
mlocListener = null;

这将为所有 android 版本修复它。

【讨论】:

  • 嗨,我已经修改了代码以在 onPause() 方法中运行,但是一旦获取了位置锁,它会在侦听器被移除之前继续获得大约 5 个锁。这对我的应用程序有影响,因为在 onLocationchanged 我向用户显示了一个警报对话框。因此,您可以看到一个新的对话框循环,因为位置侦听器在最终取消注册之前获得了新的锁。有没有办法在找到锁后立即取消注册监听器?谢谢
  • 当然,您总是可以在第一次调用 onLocationChanged 时取消注册监听器(并忽略进一步的调用),但这对我来说没有多大意义,特别是因为第一个位置通常不是在准确性和精度方面最好的一个
  • 嗨,我取消了 onLocationChanged 方法中已删除的更新,它工作正常。我理解你所说的没有得到准确的修复,我通常不会在涉及位置的地方这样做,但我只需要一个锁来调用 loc 对象上的 getTime() 。只是将外部时间与系统时间进行比较。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-07
  • 2023-03-13
  • 2016-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多