0

[我知道这与 2010 年提出的问题重复,但该问题从未真正得到答案]

我正在将我的一些 Windows Phone 应用程序转换为 Android。这些应用程序都围绕运动跟踪。在 WP7 中,位置观察器有一个“MovementThreshold”属性,用于设置 GPS 需要多少移动才能触发移动事件。通常,我们希望步行时的阈值较低,而在喷气式飞机中的阈值较高。它可以通过这样的代码进行节流,如果速度发生变化,每次我们移动时都会改变它。

        if (mph < 7) watcher.MovementThreshold = 5;
            else if (mph < 15) watcher.MovementThreshold = 20;
            else if (mph < 30) watcher.MovementThreshold = 100;
            else if (mph < 50) watcher.MovementThreshold = 400;
            else if (mph < 100) watcher.MovementThreshold = 800;
            else if (mph < 120) watcher.MovementThreshold = 1200;
            else if (mph < 200) watcher.MovementThreshold = 2400;
            else if (mph < 400) watcher.MovementThreshold = 4800;
            else watcher.MovementThreshold = 9000;

目前在我的应用程序的 Android 版本中,当我的位置服务启动时,我会进行以下调用... locMgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locLstnr);

第三个参数是 minDistance(现在设置为零),听起来很像 WP7 中的 MovementThreshold。

我的第一个问题是:我可以像在我的 WP7 应用中限制 MovementThreshold 一样限制我的 Android 应用中的 minDistance 吗?我的第二个问题是:什么样的调用最有效地进行节流?- 我会重复上述 requestLocationUpdates 调用更改 minDistance 参数吗?谢谢,加里

4

2 回答 2

0

最有效的节流方法是基于时间。该文档已在另一个答案中被引用,但很明显,设备必须先进行距离测量并对其进行过滤,然后才能计算距离阈值,而时间阈值允许设备避免进行位置测量。

我鼓励您使用固定时间进行轮询,因此只需设置一次更新。问自己这个问题——“我的应用需要多快知道距离的变化(任何距离)?” 如果您可以在其上添加一个数字(1 秒、100 秒等),请将其用作您的更新时间。如果你想避免额外调用你的回调函数,你也可以使用 minDistance。

请注意,您的阈值已经在“时间”中。您正在计算速度(mph)并且您有一个距离阈值(米,我假设,因为 WP7 中的“MovementThreshold”以米为单位),您可以轻松计算在阈值中移动距离所需的时间(距离 /速度和单位变化的帐户)并将该数字用作您的 minTime,因为您知道该时间之前的任何测量不应大于您的距离阈值,除非设备已改变速度。这为您提供了您正在寻找的滑动比例,但使用更有效的 minTime。

如果速度发生变化,您的轮询时间将关闭,直到您以新的速度进行第一次读取。我怀疑这对您来说并不重要,因为如果以高分辨率检测这些变化很重要,您可能已经根据时间而不是距离进行轮询。

于 2012-12-15T02:02:36.550 回答
0

我可以像在我的 WP7 应用中限制 MovementThreshold 一样限制我的 Android 应用中的 minDistance 吗?

恕我直言,不是真的。速度会有所不同,因此您需要持续的 GPS 定位来确定速度,以便您可以调整节流,从而消除节流。特别是,当喷气式飞机降落时,您可能需要一段时间才能发现这一点,因为您正在等待用户先步行(或开车)几公里。

当然,你在 WP7 中也需要它,所以我不知道你是如何将它拉到那里的。

就个人而言,我会自己进行过滤,而不是使用minDistance它。

什么样的调用最有效地进行节流?- 我会重复上述 requestLocationUpdates 调用更改 minDistance 参数吗?

原则上,是的。但是,引用文档:

minDistance 参数还可用于控制位置更新的频率。如果它大于 0,那么位置提供程序将仅在位置已更改至少 minDistance 米并且至少 minTime 毫秒已过去时向您的应用程序发送更新。然而,位置提供者使用 minDistance 参数来节省电量更加困难,因此 minTime 应该是节省电池寿命的主要工具。

(请注意,此处有关的文档评论minTime仅与较新版本的 Android 真正相关;Android 1.x/2.x 用作minTime提示,而不是过滤器)

于 2012-12-14T20:29:40.970 回答