需要同步 onLocationChanged

Posted

技术标签:

【中文标题】需要同步 onLocationChanged【英文标题】:need to sync onLocationChanged 【发布时间】:2012-11-24 15:18:03 【问题描述】:

我正在创建一个应用程序,它通过网络广播用户的位置,为此我创建了一项服务,我在其中使用LocationListener 并从中获取更新 onLocationChanged

我将requestLocationUpdates设置如下

locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
                                                15000,
                                                0, 
                                                geoHandler);

每当我在onLocationChanged 中获得更新时,我都会通过网络广播该位置。

现在的问题是onLocationChanged 被触发太频繁,即使它没有超过时间限制(这是完全不可预测的),这反过来又触发了我正在广播位置的自定义函数信息过于频繁。

所以我不知道如何以适当的及时方式同步此过程,例如每 15 秒通过网络广播一次该位置,而不是过于频繁地启动它

【问题讨论】:

如何使用每 15 秒重复一次的Alarm。然后启动您的Service,您可以检查位置是否已更改,并在必要时广播该位置。这似乎是一种基本方法。我可能在你的问题中遗漏了一些东西。 @KerimOguzcanYenidunya 这是一个非常糟糕的方法。您白白消耗电力和电池。 @Hunt 请检查您的代码,因为我刚刚测试了与您相同的方法,并且效果很好。 @Tudor 你试过服务吗? @Hunt 是的,但时间间隔更长。 【参考方案1】:

onLocationChanged 的调用频率如何?

这是一种奇怪的行为,因为当您将 minTime!=0 参数添加到:

locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, minTime, minDistance, geoHandler)

那么只有在 minTime 之后才会通知监听器。

经过更深入的研究,我发现 minTime 是相对的。它取决于许多因素,因此您的 onLocationChanged 不会在 minTime 之后精确调用。 Google 建议将此参数用于电源和电池效率。所以你应该使用更大的值,比如 1000*60*5(5 分钟)。

如果您确实需要每 15 秒广播一次您的位置,请记住 GPS 精确定位无法立即触发,至少需要 5-10 秒(最佳情况)。因此,您必须将您的设计更改为以下内容:

locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, geoHandler)onLocationChanged 中检查您上次发送/处理您的位置的时间,如果经过的时间>= 15 秒,则广播它;

希望对你有帮助。

【讨论】:

有时每秒调用一次,有时每 5 秒调用一次,因此完全无法预测。 @Hunt 你增加了 minDistance 的值吗? 不是零,有标准值吗? 您给了 minTime 15 秒,但由于 minDistance 为 0,因此它被认为过于频繁地更新。您需要设置一些您认为不会对 gps 值造成显着变化的值。 @KerimOguzcanYenidunya 如果 minTime=15sec 和 minDistance=1meter 那么两个标志都必须为真才能进行调用。时间和距离都必须大于 minTime 和 minDistance。【参考方案2】:

locationManager.requestLocationUpdates (String provider, long minTime, float minDistance, LocationListener listener)

minTime 是位置更新之间的最小时间间隔,以毫秒为单位

minDistance 是位置更新之间的最小距离,以米为单位

您将 minTime 设置为 15 秒,但由于您的 minDistance 为 0 米,因此触发过于频繁。由于 GPS 值的微小变化会触发位置更新,因此无需等待 15 秒即可通过。提供一些米(例如 1 或 3)将增加更新之间的间隔。

【讨论】:

我尝试将其设置为 1,是的,它的启动频率较低,但由于必须满足两个条件,因此 15 秒间隔不起作用

以上是关于需要同步 onLocationChanged的主要内容,如果未能解决你的问题,请参考以下文章

多终端数据同步机制设计

Java中哪些情况需要同步方法访问?

java中同步和异步有啥异同?

结合同步和异步方法调用,并根据异步的结果,我们需要循环同步方法调用

同步异步阻塞非阻塞

ConcurrentHashmap在我的实现中是否需要同步?