1

我有以下代码可以从NETWORK_PROVIDER和请求位置更新GPS_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()两次?

4

1 回答 1

2

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

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

当您调用 时requestLocationUpdates,它会将您传递的侦听器放入该 HashMap..并且由于 HashMaps 不允许重复键,我不相信您将能够为不同的提供程序类型共享相同的侦听器。

话虽如此,由于不能有重复的键,因此从技术上讲,一次调用 removeUpdate 就足够了,因为调用 remove 只是删除了 LocationListener 映射到的 ListenerTransport 值......但这并不能真正帮助你,因为你不会能够使用相同的侦听器拥有两种不同的提供者类型。

于 2013-04-28T20:42:55.013 回答