我正在检测设备的方向,检查它是否颠倒放置在一个表面上,然后调用一个方法。我遇到的问题是,用户可能会无意中将设备的方向转到该位置一秒钟,然后返回一个正面朝上的位置来更正错误,但是,第一次这样做时,仍然会调用该方法。
我试图在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);
   }
}

10-07 22:39