java - Android中LocationListener的SettableFuture block 事件

标签 java android location future

我有以下问题。我正在为 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/

相关文章:

java - 从另一个类访问 JTextfield 中的值

android - 在 Android 应用程序中同时下载多个文件

Android AutoCompeleteTextView 没有给出正确的结果

android - DrawerLayout 卡在滑动上

iphone - 在没有核心位置的情况下查找用户所在城市

android - 有没有类似IOS显着变化定位服务的Android服务或APP?

Android:仅当位置已更改时,才每 15 分钟将用户位置发送到服务器?

java - 使用 JLayer(AKA JavaLayer)在 java 中分析 mp3 文件?

java - Treeset 按字母顺序排序

java - 使用 Spring 任务命名空间安排任务运行一次