我有以下代码可从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()

最佳答案

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

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


而且,当您调用requestLocationUpdates时,它会将传递给该HashMap ..的侦听器放入其中。由于HashMaps不允许重复的键,因此我认为您将不能为不同的提供程序类型共享同一侦听器。

话虽这么说,因为不能有重复的键,所以从技术上讲,一次调用removeUpdate就足够了,因为调用remove只是删除了LocationListener映射到的ListenerTransport值...但这对您没有真正的帮助,因为您不会能够使用相同的侦听器具有两种不同的提供程序类型。

08-06 07:11