我正在检测设备的方向,检查它是否颠倒放置在一个表面上,然后调用一个方法。我遇到的问题是,用户可能会无意中将设备的方向转到该位置一秒钟,然后返回一个正面朝上的位置来更正错误,但是,第一次这样做时,仍然会调用该方法。
我试图在800毫秒的延迟时间内对方向添加一个“双重检查”,这样用户就有时间在触发该方法之前更正方向。不幸的是,我无法控制调用onSensorChanged
的频率,以便添加具有800ms延迟的线程,该线程将重复检查方向,以防止意外的方向更改。
我的代码如下,
public SensorEventListener accelerometerListener = new SensorEventListener(){
@Override
public void onSensorChanged(SensorEvent event) {
float z_value = event.values[2];
if (z_value < 0) {
//the device is now upside-down
try {
Thread.sleep(800);
//this if statement is never called correctly because
// onSensorChanged is not called again.
if (z_value < 0) {
toggleMethod();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
我的问题是:有没有一种方法可以调用onsensorchanged方法本身中的延迟
onSensorChanged
来执行双重检查? 最佳答案
一个非常简单的方法是让传感器在接下来的N毫秒内给出一个新值(正如所要求的那样),如下所示:
1-决定要给用户多少毫秒以撤消其操作(您使用了800毫秒):
private static final long TIME_MARGIN_FOR_USER_TO_UNDO = 800;
2-创建一个处理程序和一个runnable来执行您的操作(让它们位于比onsensorchanged更大的范围内-例如,您的活动):
Handler sensorHandler = new Handler();
Runnable toggleRunnable = new Runnable() {
public void run() {
toggleMethod();
}
}
3-只要if语句的计算结果为true,就可以发布此runnable;但是,请在n毫秒后发布它。
@Override
public void onSensorChanged(SensorEvent event) {
float z_value = event.values[2];
if (z_value < 0) {
sensorHandler.postDelayed(toggleRunnable, TIME_MARGIN_FOR_USER_TO_UNDO);
}
}
4-由于在更改传感器值时将调用onsensorchanged,因此如果用户修复了runnable,则可以停止它的运行。因此,您需要一个else语句来删除runnable。
@Override
public void onSensorChanged(SensorEvent event) {
float z_value = event.values[2];
if (z_value < 0) {
sensorHandler.postDelayed(toggleRunnable, TIME_MARGIN_FOR_USER_TO_UNDO);
}
else {
sensorHandler.removeCallbacks(toggleRunnable);
}
}