【问题标题】:How to update View in response to LocationListener.onLocationChanged()?如何更新视图以响应 LocationListener.onLocationChanged()?
【发布时间】:2010-07-12 19:21:20
【问题描述】:

我正在开发的应用程序只有在某个位置获得某个位置后才能有意义地启动 - 粗略,很好,没关系。它只需要一个不为空的。因此,我的 Activity 类正在执行以下操作:

onCreate():

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

onResume():

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

(同时)

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

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

所以……

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

  2. 如果您从 LocationProvider 请求更新并将已注册以接收更新的 LocationListener 传递给它,会发生什么情况?它只是用新的替换之前的时间和距离参数,还是会在订阅者列表中创建两个条目,并在下次位置更新时调用 LocationListener 两次?

  3. 如果应用程序在注册更新时取消其对 LocationListener 的所有引用,会发生什么情况?由于 LocationProvider 的引用,它是否像僵尸一样继续存在?还是 LocationProvider 对所有内容都使用 Wea​​kReferences,所以旧的、被遗忘的 LocationListener 将超出范围并被垃圾收集?

  4. 如果 LocationListener 实现类引用了 LocationManager,是否允许调用其 onLocationChanged() 方法的线程使用它来更改当前 LocationListener 的订阅条款?还是会因为一个愤怒的警告而爆发,就像尝试从错误类型的线程更新视图一样?

【问题讨论】:

  • 不确定它是否与您的 Map 和不同的听众有关,您可能正在尝试使用 addProximityAlert developer.android.com/intl/de/reference/android/location/… 构建一个存在的功能
  • 关于 1,如果问题是因为您在错误的线程上而遇到异常,您可以通过使用 runOnUiThread 活动来解决。对于 2,您不能在主要活动暂停时取消注册您的侦听器吗?
  • 我不想在活动暂停(或什至停止,就此而言)取消注册它们,因为我希望它们尝试并活得足够长,以至少获得一个有意义的更新缓存在LocationProvider 所以下次我尝试调用它时它会立即使用。这个想法是用 0,0 启动侦听器,表示“现在更新,d***it,快点!”,然后在他们实际产生更新后取消注册,这样他们就不会一遍又一遍地尝试更新,如果应用程序被遗忘/停止并且仍然注册的侦听器,尽可能快地无限期地运行。
  • @Pentium10: 哎呀,我想我不是很清楚......我的“地图”对象是 HashMap,而不是“GoogleMap”。它的全部目的是让我可以创建侦听器并注册它们以进行更新,但能够在稍后返回通过堆查看哪些仍然存在并且需要取消注册以进行更新。
  • 但是为什么需要多个监听器呢?

标签: android


【解决方案1】:
  1. 您没有“让主 UI 线程(?)等待”。如果您“让主 UI 线程(?)等待”,您的用户体验将会很糟糕,因为他们会想知道为什么您的应用程序会因“应用程序无响应”错误而不断崩溃。相反,您显示ProgressDialog 或其他内容让用户知道等到您得到修复,并在修复完成后关闭该对话框。这里还有其他模式。

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

  3. 是的,它继续存在。

  4. AFAIK,比如说,从onLocationChanged() 中调用LocationListener 上的removeUpdates() 没有问题。再说一次,我还没有尝试过。如果它确实抱怨(很可能是某种形式的ConcurrentModificationException),让onLocationChanged() 在您的post() 上调用MapView,以安排在将调用@ 的主应用程序线程的事件循环上调用Runnable 987654331@.

【讨论】:

  • 嗨!感谢回复!我有你所有的书(嗯,至少是 Commonsware 的书和你的新 Apress 书)。是否有一章我忽略了,它解释了在主线程到达 onResume() 结束和隐喻地从隐含的“返回”悬崖跌入某个未知的边缘之间发生的事情,以及某事导致它的点启动到 onPause()?我开始认为我患有“HelloWorld 综合症”——我已经看到了很多类似 HelloWorld 的例子,以至于我(继续)
  • 开始将它们误认为是创建 Android 应用程序的正确方法,并创建了一个可怕的类似科学怪人的应用程序,该应用程序基本上是通过在此过程中被滥用的 Intent 链接在一起的一系列 HelloWorld 活动 ;-)跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-28
  • 1970-01-01
相关资源
最近更新 更多