我有以下问题。我正在为 android 4.4-6 编写一个使用位置的应用程序,我决定将确定位置包装在一个方便的类中。
因为确定位置是一个异步过程,所以我从此类的方法返回未解析的 future,在此类中监听位置事件,当我以正确的精度获取位置事件时,我解析 settablefuture(来自 Google guava 库)
这个 future 在另一个类中使用,因为我执行了一些检查(加速度计,然后是接近度,然后是位置),并且想要线性处理它,并且 future 在这里感觉很自然(我来自 JavaScript 世界,仅使用 java 作为爱好)。
但是,这个可设置的 future 似乎在等待解决时会阻止一切,并且事件循环也被阻止,因此即使手机正在确定位置,也永远不会在我的位置监听器上调用 onLocationChanged 方法。当然我在位置管理器中注册它。因此,在 10 秒不活动后,我用 null 值解析 future,有时之后我的位置监听器会收到更新(有趣的事实是,有时会在取消注册后发生这种情况,因此这表明事件队列以某种方式被阻止)
有人知道如何解决这个问题吗? Source code of this class in gitHub
最佳答案
您正在使用 GoogleServicesApi
,对吗?您应该考虑利用 FusedLocationApi#requestLocationUpdates
并定期更新。继续保存每个更新的Location
,然后在有请求时返回最新的位置。例如,有一个实现 LocationListener
的类,其中有一个字段
private Location bestEstimate;
和 setter/getter
public Location getBestEstimate() {
return bestEstimate;
}
此方法的问题是当 bestEstimate
仍为 null
(或 Optional#absent
,因为您使用的是 Guava)时该怎么办。 )我将把如何处理它留给你。
您可以更进一步,使用 SharedPreferences
保存每个位置更新,以减少在应用关闭、后台运行等情况下不知道位置的可能性。
关于java - Android中LocationListener的SettableFuture block 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35869754/