【发布时间】:2010-07-12 19:21:20
【问题描述】:
我正在开发的应用程序只有在某个位置获得某个位置后才能有意义地启动 - 粗略,很好,没关系。它只需要一个不为空的。因此,我的 Activity 类正在执行以下操作:
onCreate():
- 实例化 LocationManager
- 创建地图,以便跟踪我请求更新的所有 LocationListener 对象。
onResume():
- 从 LocationManager 获取已启用的 LocationProvider 列表
- 遍历列表。对于每一个,检查 Map 中是否已经存在 LocationListener。如果没有,请创建一个新的,注册更新,然后将其粘贴到地图中。
- 渲染视图
- 从 onResume() 隐式返回。我很惭愧地承认这一点,但我完全不知道此时线程会发生什么。
(同时)
... LocationManager.onLocationChanged(Location) 被调用。最初的计划是使用我的 LocationManager 对 Activity 对象的引用来调用一个方法,该方法的目的是更新视图以反映新的状态。显然,Android 不允许这样做。
...用户单击与 LocationProvider 更新之一相关联的按钮,程序继续完成启动,或者用户厌倦了等待,单击取消,程序退出,因为没有任何意义它可以做一个位置。
所以……
什么是让主 UI 线程(?)等到另一个线程使用更新的值调用 onLocationChanged(),更新 UI,然后继续启动下一个 Activity 的 Intent 或调用 finish() 的正确方法是什么取决于用户是单击与位置关联的按钮还是单击取消?
如果您从 LocationProvider 请求更新并将已注册以接收更新的 LocationListener 传递给它,会发生什么情况?它只是用新的替换之前的时间和距离参数,还是会在订阅者列表中创建两个条目,并在下次位置更新时调用 LocationListener 两次?
如果应用程序在注册更新时取消其对 LocationListener 的所有引用,会发生什么情况?由于 LocationProvider 的引用,它是否像僵尸一样继续存在?还是 LocationProvider 对所有内容都使用 WeakReferences,所以旧的、被遗忘的 LocationListener 将超出范围并被垃圾收集?
如果 LocationListener 实现类引用了 LocationManager,是否允许调用其 onLocationChanged() 方法的线程使用它来更改当前 LocationListener 的订阅条款?还是会因为一个愤怒的警告而爆发,就像尝试从错误类型的线程更新视图一样?
【问题讨论】:
-
不确定它是否与您的 Map 和不同的听众有关,您可能正在尝试使用
addProximityAlertdeveloper.android.com/intl/de/reference/android/location/… 构建一个存在的功能 -
关于 1,如果问题是因为您在错误的线程上而遇到异常,您可以通过使用 runOnUiThread 活动来解决。对于 2,您不能在主要活动暂停时取消注册您的侦听器吗?
-
我不想在活动暂停(或什至停止,就此而言)取消注册它们,因为我希望它们尝试并活得足够长,以至少获得一个有意义的更新缓存在LocationProvider 所以下次我尝试调用它时它会立即使用。这个想法是用 0,0 启动侦听器,表示“现在更新,d***it,快点!”,然后在他们实际产生更新后取消注册,这样他们就不会一遍又一遍地尝试更新,如果应用程序被遗忘/停止并且仍然注册的侦听器,尽可能快地无限期地运行。
-
@Pentium10: 哎呀,我想我不是很清楚......我的“地图”对象是 HashMap
,而不是“GoogleMap”。它的全部目的是让我可以创建侦听器并注册它们以进行更新,但能够在稍后返回通过堆查看哪些仍然存在并且需要取消注册以进行更新。 -
但是为什么需要多个监听器呢?
标签: android