如何更新View以响应LocationListener.onLocationChanged()?

时间:2010-07-12 03:03:39

标签: android

我正在研究的应用程序无法有意义地启动,直到它从某个地方有一个位置 - 粗糙,精细,无所谓。它只需要一个非空的。所以,我的Activity类正在做以下几点:

onCreate():

  • 实例化LocationManager
  • 创建Map,以便跟踪我已请求更新的所有LocationListener对象。

的onResume():

  • 从LocationManager
  • 获取已启用的LocationProviders列表
  • 遍历列表。对于每一个,检查Map中是否已有LocationListener。如果没有,请创建一个新的,注册以获取更新,并将其粘贴在Map中。
  • 渲染视图
  • 从onResume()隐式返回。我很惭愧承认这一点,但我完全不知道此时线程会发生什么。

(与此同时)

...调用LocationManager.onLocationChanged(Location)。最初的计划是使用我的LocationManager对Activity对象的引用来调用一个方法,其目的是更新视图以反映新状态。显然,Android不允许这样做。

...用户点击与其中一个LocationProvider更新相关联的按钮,程序继续完成启动,或者用户厌倦了等待,点击取消,程序退出,因为没有任何意义,没有任何意义一个位置。

所以......

  1. 主UI空间(?)的正确方法是等到另一个线程使用更新的值调用onLocationChanged(),更新UI,然后继续启动下一个Activity的意图或调用finish()取决于用户是否单击与位置关联的按钮或单击取消?

  2. 如果您从LocationProvider请求更新并向其传递已注册接收更新的LocationListener,会发生什么?它只是用新的时间和距离args替换它,或者它会在订户列表中创建两个条目,并在下次更新位置时调用LocationListener TWICE吗?

  3. 如果应用程序在仍然注册更新时取消了对LocationListener的所有引用,会发生什么?由于LocationProvider的引用,它是否像Zombie一样存在?或者,LocationProvider是否会将WeakReferences用于所有内容,那么旧的,遗忘的LocationListeners是否会超出范围并被垃圾收集?

  4. 如果LocationListener实现类具有对LocationManager的引用,那么调用其onLocationChanged()方法的Thread是否允许使用它来更改当前LocationListener的订阅条款?或者这会引发愤怒的警告,就像尝试从错误类型的线程更新视图一样?

1 个答案:

答案 0 :(得分:0)

  1. 您没有“主UI线程(?)等待”。如果您“拥有主UI线程(?)等待”,您的用户体验会很糟糕,因为他们会想知道为什么您的应用程序会因“应用程序无响应”错误而崩溃。相反,您显示ProgressDialog或其他东西让用户知道等到你得到修复,并在修复程序进入时关闭该对话框。此处还有其他模式。

  2. 我不确定 - 我总是使用不同的LocationListener个对象。

  3. 是的,它继续存在。

  4. AFAIK,例如,在removeUpdates()LocationListener上调用onLocationChanged()没问题。然后,我还没试过。如果它确实投诉(最有可能使用某种形式的ConcurrentModificationException),请onLocationChanged() post()调用MapView,以便安排调用Runnable主应用程序线程的事件循环将调用removeUpdates()