2

我有一个安卓应用程序。根据用户当前的地理位置,我想在后台获取一些远程数据并存储。我的实现是:

在特定的时间间隔,警报会启动我的服务。服务使用匿名类查询当前位置并注册一个 locationListener 回调。在调用 onLocationChanged() 时,我启动从服务器获取远程数据。

但是,一旦我的服务完成使用匿名类注册位置侦听器,它就会按预期返回;因为它不会在完成之前等待回调发生。由于回调需要一些时间并在服务已经返回时进行调用,所以它会抛出一个错误说:

java.lang.RuntimeException: Handler{43e82510} sending message to a Handler on a dead thread

这是完全可以理解的。现在对我来说一个快速的解决方法是我可以使用 locationManager 中的 getLastKnownLocation ,因为它不会通过回调响应;但是如果我现在确实想要最新的位置,在服务中而不是活动中怎么办?如何等待回调发生并停止我的服务返回。

另外,lastKnownlocation 在什么时候更新?每次 GPS 注册一个新位置时;它会更新吗?我想知道的是,如果它不是最新的,它仍然可以关闭到最新吗?因为我在 android 模拟器中没有看到配置后续更新之间时间段的选项。

任何帮助深表感谢。干杯

4

1 回答 1

4

但是如果我现在确实想要最新的位置,在服务中而不是活动中怎么办?

抱歉,这在服务或活动中是不可能的。例如,如果 GPS 无线电已关闭,而您正在从 GPS 请求位置数据,则需要数十秒才能得到修复,如果您很幸运的话。它可能根本无法修复。

如何等待回调发生并停止我的服务返回。

你没有。你做你说你会做的事:

使用 locationManager 中的 getLastKnownLocation ,因为它不会通过回调响应

所以,让你的Service(希望是IntentService)检查一下是否getLastKnownLocation()碰巧有一个值。如果是,请使用它。否则,registerLocationUpdates()使用 a PendingIntentthat 会将控制权交还给您的IntentService. 当你得到 Intent时,使用该位置并取消注册更新(假设警报周期很好而且很长,比如每小时一次)。

如果您的警报是 _WAKEUP 警报,事情就会变得棘手。然后,您需要按住WakeLock,以便在您尝试获取 GPS 定位时设备不会重新进入睡眠状态。但是,您需要在WakeLock某个时候发布它,如果我们无法获得 GPS 定位……嗯……嗯,这就是棘手的部分。试图找出一种干净的方式来处理这个问题,并将其实现为可重用的组件(例如,LocationAlarmService),这是我的待办事项清单上的 18,000 项之一。

另外,lastKnownlocation 在什么时候更新?每次 GPS 注册一个新位置时;它 > 更新它吗?

AFAIK,是的。

于 2010-09-18T22:07:50.103 回答