我正在研究的应用程序无法有意义地启动,直到它从某个地方有一个位置 - 粗糙,精细,无所谓。它只需要一个非空的。所以,我的Activity类正在做以下几点:
onCreate():
的onResume():
(与此同时)
...调用LocationManager.onLocationChanged(Location)。最初的计划是使用我的LocationManager对Activity对象的引用来调用一个方法,其目的是更新视图以反映新状态。显然,Android不允许这样做。
...用户点击与其中一个LocationProvider更新相关联的按钮,程序继续完成启动,或者用户厌倦了等待,点击取消,程序退出,因为没有任何意义,没有任何意义一个位置。
所以......
主UI空间(?)的正确方法是等到另一个线程使用更新的值调用onLocationChanged(),更新UI,然后继续启动下一个Activity的意图或调用finish()取决于用户是否单击与位置关联的按钮或单击取消?
如果您从LocationProvider请求更新并向其传递已注册接收更新的LocationListener,会发生什么?它只是用新的时间和距离args替换它,或者它会在订户列表中创建两个条目,并在下次更新位置时调用LocationListener TWICE吗?
如果应用程序在仍然注册更新时取消了对LocationListener的所有引用,会发生什么?由于LocationProvider的引用,它是否像Zombie一样存在?或者,LocationProvider是否会将WeakReferences用于所有内容,那么旧的,遗忘的LocationListeners是否会超出范围并被垃圾收集?
如果LocationListener实现类具有对LocationManager的引用,那么调用其onLocationChanged()方法的Thread是否允许使用它来更改当前LocationListener的订阅条款?或者这会引发愤怒的警告,就像尝试从错误类型的线程更新视图一样?
答案 0 :(得分:0)
您没有“主UI线程(?)等待”。如果您“拥有主UI线程(?)等待”,您的用户体验会很糟糕,因为他们会想知道为什么您的应用程序会因“应用程序无响应”错误而崩溃。相反,您显示ProgressDialog
或其他东西让用户知道等到你得到修复,并在修复程序进入时关闭该对话框。此处还有其他模式。
我不确定 - 我总是使用不同的LocationListener
个对象。
是的,它继续存在。
AFAIK,例如,在removeUpdates()
内LocationListener
上调用onLocationChanged()
没问题。然后,我还没试过。如果它确实投诉(最有可能使用某种形式的ConcurrentModificationException
),请onLocationChanged()
post()
调用MapView
,以便安排调用Runnable
主应用程序线程的事件循环将调用removeUpdates()
。