0

我需要获取接近传感器的当前值(而不是实现一个连续的监听器)。在某些设备上,第一个报告的值将是一个不一定准确的默认值(例如“FAR”),而实际值只会在第二次或第三次读数后才开始出现。目前,我已经实现了 1 秒Handler,并使用最后报告的值(在第二秒过去之后)作为“真实”值,但这个解决方案看起来很粗糙(而且很慢)。有没有更好的方法适用于所有 4.0+ 设备?我可以简单地计数,直到收到 3 个读数,但在某些设备(例如 GNex)上,第一个值将是正确的,并且只有在传感器实际发生变化时,该值才会在此之后发生变化。

4

1 回答 1

1

你可以做我做的事情:
你可能有一个if关于监听器的声明——一个逻辑流用于近,一个逻辑流用于远。
而不是等待处理程序 - 这样做:

if(near) {
   myHandler.removeCallbacks(yourRunnableForFar);
   myHandler.postDelayed(yourRunnableForNear,100);
else {
   myHandler.removeCallbacks(yourRunnableForNear);
   myHandler.postDelayed(yourRunnableForFar,100);
}

请注意,不准确的第一个读数将立即跟随一个准确的读数,因此最后一个读数“获胜”。

如果您没有注册除接近之外的传感器,则此代码运行良好。如果您有来自其他传感器的读数流,则使用静态标志(例如boolean near)仅在状态更改时触发处理程序调用。

详细说明:
yourRunnableForFaryourRunnableForNear- 是占位符,implement Runnable用于保存您的应用程序逻辑,当接近传感器返回“近”(event.values[0] == 0)或“远”(不是 0)时要做什么。

myHandler只是您可能创建的任何处理程序,或为此声明一个处理程序 Handler myHandler = new Handler(Looper.getMainLooper());

您可能希望在近处获取接近锁,然后释放它并清除远处的侦听器。但这是应用程序逻辑,可能因应用程序而异。

于 2014-01-18T20:49:26.207 回答