取消注册多个LocationListeners

时间:2013-04-28 20:27:24

标签: android geolocation

我有以下代码从NETWORK_PROVIDERGPS_PROVIDER请求位置更新。

locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0,
                                  mNetworkLocationListener);
locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,
                                  mGpsLocationListener);

我目前每个都有一个单独的监听器,但两个监听器中的代码是相同的,所以我想将它们组合成一个监听器mLocationListener。我会将此传递给上面的两个requestLocationUpdates调用,因此我会继续接收来自这两个来源的更新。

稍后我将使用

取消注册此共享侦听器
locManager.removeUpdates(mLocationListener);

removeUpdates()州的Javadoc

  

删除指定LocationListener的所有位置更新。

     

此次调用后,此侦听器将不再进行更新。

那么,我可以安全地假设,当我两次注册同一个监听器时,对removeUpdates()的单个呼叫就足够了,或者我是否也需要两次呼叫removeUpdates()

1 个答案:

答案 0 :(得分:2)

在内部,LocationManager类将传递给requestLocationUpdates的侦听器映射到ListenerTransport对象,如下所示:

 private HashMap<LocationListener,ListenerTransport> mListeners =
        new HashMap<LocationListener,ListenerTransport>();

当你打电话给requestLocationUpdates时,它会把你传递给那个HashMap的Listener ......并且因为HashMaps不允许重复键,所以我不相信你能够分享针对不同提供者类型的相同侦听器。

话虽如此,因为不能有重复的键,从技术上来说,一次调用removeUpdate就足够了,因为对remove的调用只是删除了LocationListener映射到的ListenerTransport值......但是这对你真的没什么帮助。你不可能有两个不同的提供者类型具有相同的监听器。