Android 如何更新视图以响应LocationListener.onLocationChanged()?

Android 如何更新视图以响应LocationListener.onLocationChanged()?,android,Android,我正在开发的一个应用程序只有在它从某个地方找到一个位置后才能有意义地启动——不管是粗糙的还是精细的,都无所谓。它只需要一个不是空的。因此,我的活动课是按照以下思路进行的: onCreate(): 实例化LocationManager 创建映射,以便跟踪我请求更新的所有LocationListener对象 onResume(): 从LocationManager获取已启用LocationProviders的列表 遍历列表。对于每一个,检查地图中是否已经有LocationListener。如果

我正在开发的一个应用程序只有在它从某个地方找到一个位置后才能有意义地启动——不管是粗糙的还是精细的,都无所谓。它只需要一个不是空的。因此,我的活动课是按照以下思路进行的:

onCreate():

  • 实例化LocationManager
  • 创建映射,以便跟踪我请求更新的所有LocationListener对象
onResume():

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

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

。。。用户单击与某个LocationProvider更新相关联的按钮,程序将继续完成启动,或者用户厌倦了等待,单击“取消”,程序将退出,因为如果没有位置,它将无法执行任何有意义的操作

所以

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

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

  • 如果应用程序在注册更新时取消了对LocationListener的所有引用,会发生什么情况?多亏了LocationProvider的推荐,它还活着吗,像僵尸一样?或者LocationProvider是否对所有内容都使用weakreference,因此旧的、被遗忘的LocationListeners将不在作用域内并被垃圾收集

  • 如果LocationListener实现类引用了LocationManager,那么调用其onLocationChanged()方法的线程是否允许使用它更改当前LocationListener的订阅条款?还是会像试图从错误类型的线程更新视图一样发出愤怒的警告

  • 您没有“让主UI线程(?)等待”。如果你“让主UI线程(?)等待”,你的用户体验会很糟糕,因为他们会想知道为什么你的应用程序总是因为“应用程序没有响应”错误而崩溃。相反,您会显示一个
    ProgressDialog
    或其他内容,让用户知道等待,直到您得到修复,并在修复时关闭该对话框。这里还有其他模式

  • 我不确定——我总是使用distinct
    LocationListener
    对象

  • 是的,它还活着

  • 好的,比如说,从
    onLocationChanged()
    中调用
    LocationListener
    上的
    removeUpdates()
    是没有问题的。再说一遍,我还没有试过。如果它确实抱怨(很可能是某种形式的
    ConcurrentModificationException
    ),则在
    MapView
    上调用
    onLocationChanged()
    调用
    post()
    ,以计划在将调用
    removeUpdates()
    的主应用程序线程事件循环上调用
    Runnable


  • 不确定它是否相关,但可能与地图和不同的侦听器有关,您正试图使用
    addProximityAlert
    针对1构建一个存在的功能,如果问题是由于您在错误的线程上而导致异常,您可以使用activitys runOnUiThread解决该问题。对于2,难道你不能在主活动暂停时注销你的侦听器吗?我不想在活动暂停(或甚至停止)时注销它们,因为我想让他们尝试并且活得足够长,至少可以在LocationProvider中缓存一个有意义的更新,这样下次我尝试调用它时,它就会立即在那里使用。我们的想法是使用0,0来启动侦听器,意思是“立即更新,d***它,快点!”,然后在实际生成更新后注销它们,这样,如果应用程序被忘记/停止,而侦听器仍在注册,那么它们就不会不断尝试更新。奔腾10:Oops,我想我不清楚。。。我的“Map”对象是一个HashMap,而不是一个“GoogleMap”。它的全部目的是让我可以创建侦听器并注册它们以进行更新,但我可以在稍后的时间回顾这堆侦听器以查看哪些仍然存在&需要取消注册以进行更新。但是为什么需要多个侦听器呢?嗨!谢谢回复!我有你所有的书(至少是公用软件和你的新书)。是否有一章我忽略了,它解释了主线程到达onResume()结尾的时间&隐喻性地从隐含的“返回”悬崖跌落到未知的边缘,以及某件事情导致它进入onPause()的时间之间发生了什么?我开始觉得自己患上了“HelloWorld综合症”——我看到了太多类似HelloWorld的例子,以至于我(继续)开始把它们误认为是创建Android应用程序的正确方法,并创建了一个可怕的类似弗兰肯斯坦(frankenstein)的基本应用程序