6

更新:

我能够通过引入一个类范围的静态计数器并忽略任何 x 个事件来解决我遇到的特定问题。但是我仍然想知道我做错了什么:在微秒内注册带有提示的侦听器,而不是使用四个给定常量之一。


我的应用程序中的一个 Activity 正在使用传感器来获取设备的方向、确定滚动并利用它。

我在用

SensorManager.registerListener(SensorEventListener listener, Sensor sensor, int rate)

注册我的传感器。来自此方法的 Android 文档:

参数

[...]

速度

速率传感器事件的发送时间为。这只是对系统的提示。事件的接收速度可能比指定的速率快或慢。通常会更快地接收到事件。该值必须是 SENSOR_DELAY_NORMAL、SENSOR_DELAY_UI、SENSOR_DELAY_GAME 或 SENSOR_DELAY_FASTEST 之一,或者是所需的事件之间的延迟(以微秒为单位)。

如果我使用 4 个预定义常量之一,那么应用程序可以正常工作;然而,这些常数都提供了对我的需要来说太快的速率提示。我必须发送一个 UDP 数据包,其中包含每个事件更改的一些信息,并且接收端似乎完全被使用任何预定义速率的消息淹没。使用像 30000 这样的整数(因为 API 以微秒为单位指定数量)会导致应用程序停止同时报告传感器事件。

我错过了什么阻止我使用自己的事件率提示?

4

2 回答 2

0

我很确定传感器监听器速率做了它应该做的事情。在您的问题中,您写了 30000,即 30 毫秒。在文档中,它说速度通常比提示快。所以你的速度超过了 30 毫秒。您的其他网络相关例程是否可能进展得太快?它可能导致一些阻塞,导致您相信传感器报告已停止。

在我的应用程序中,我也发现给定的 NORMAL 率太高。因此,我将速率设置为 250000。我还使用移动平均计算将数字平滑了 5。我发现结果行为接近 iPhone 指南针。

尽管如此,我不建议您在传感器侦听器中进行网络报告。不应该这样做。但是,您可以在侦听器中进行一些简单的计算并记录该值。然后,使用Handler.postDelayed具有高数字的计时器来处理网络发送等。

于 2011-10-20T15:49:12.300 回答
0

这个问题是在 2011 年提出的,但自那时以来发生了很多变化,因此回答了这个问题;从 API 19 (2013+) 开始,有一个新的注册 API 变体,您可以在其中提及您希望在什么时间间隔接收传感器读数。从文档:

boolean registerListener (SensorEventListener listener, Sensor sensor, int samplingPeriodUs, int maxReportLatencyUs) 以给定的采样频率和给定的最大报告延迟为给定的传感器注册一个 SensorEventListener。

此函数与 registerListener(SensorEventListener, Sensor, int) 类似,但它允许事件在传递之前暂时停留在硬件 FIFO(队列)中。事件可以存储在硬件 FIFO 中,最长可达 maxReportLatencyUs 微秒。一旦需要报告 FIFO 中的事件之一,则顺序报告 FIFO 中的所有事件。这意味着将在最大报告延迟过去之前报告某些事件。

于 2017-01-05T09:28:19.183 回答