如何在Android中每X秒打印一次加速度计值

时间:2014-10-08 15:34:12

标签: android multithreading delay accelerometer

我想每3秒打印一次加速度计值。到目前为止这是我的代码

@Override
    public void onSensorChanged(SensorEvent event) {
        // TODO Auto-generated method stub

        if(event.sensor.getType()==Sensor.TYPE_ACCELEROMETER)
        {              
            x = a * x + (1 - a) * event.values[0];
            y = a * y + (1 - a) * event.values[1];
            z = a * z + (1 - a) * event.values[2];
              new Handler().postDelayed(new Runnable() {
                  @Override
                  public void run() {                     
                      printValue();
                  }
              }, 3000);                        
        }

    }

它只在应用程序启动时延迟输出,我的错误是什么以及如何解决它?

5 个答案:

答案 0 :(得分:3)

您需要从onSensorChanged()删除处理程序,以便它会不断运行。现在只有在传感器读数发生变化时才会执行。此外,您需要添加一个调用以再次重新运行Runnable,否则它只会执行一次。

//Outside of onSensorChanged(), perhaps in onCreate() of your Activity
new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        printValue();
        new Handler().postDelayed(this, 3000);
    }
}, 3000);

答案 1 :(得分:0)

我对postDelayed不太熟悉,但我猜测每个run的呼叫都被延迟了3秒,但是每个延迟都是并行计算的,其中你希望他们顺序延迟,可以这么说。

根据调用onSensorChanged的频率,您可能最好做一些事情,例如检查自上次调用以来经过的时间,以及是否> 3秒后运行printValue

@Override
public void onSensorChanged(SensorEvent event) {
    // TODO Auto-generated method stub
    if(/*time elapsed > 3 seconds*/)
        if(event.sensor.getType()==Sensor.TYPE_ACCELEROMETER)
        {              
            x = a * x + (1 - a) * event.values[0];
            y = a * y + (1 - a) * event.values[1];
            z = a * z + (1 - a) * event.values[2];
              new Handler().postDelayed(new Runnable() {
                  @Override
                  public void run() {                     
                      printValue();
                  }
             }, 3000);                        
        }
    }
}

答案 2 :(得分:0)

我个人会为此使用一个线程,你可以在onCreate中启动它,因此它总是在运行,因此你不会在onSensorChanged发生时等待它开始。

Thread printvalue = new Thread(new Runnable() {
  @Override
  public void run() {
    try {
      printValue();
      Thread.sleep(3000);
    } catch (Exception e) {
      e.printstacktrace();
    }
  }
});

答案 3 :(得分:0)

您当前的代码正在等待传感器的更改,然后等待3秒并打印。

如果你想每3秒打印一次,你需要在完成后重新发布你的可运行文件。 postDelayed只是在执行前延迟,你需要在完成打印后启动另一个3秒的“计时器”。

点击此处:Android - running a method periodically using postDelayed() call

在runnable本身的run方法中调用postDelayed(runnable)。

答案 4 :(得分:0)

如果3秒钟后更新,它将打印该值。因此,它可能会在3秒和几毫秒后发生,但是您不必管理其他线程。

private final static long ACC_CHECK_INTERVAL = 3000;
private long lastAccCheck;

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    lastAccCheck = System.currentTimeMillis();
}

@Override
public void onSensorChanged(SensorEvent event) {
    long currTime = System.currentTimeMillis();
    if( event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){              
        x = a * x + (1 - a) * event.values[0];
        y = a * y + (1 - a) * event.values[1];
        z = a * z + (1 - a) * event.values[2];

        if(currTime - lastAccCheck > ACC_CHECK_INTERVAL) {
            printValue();
        }
    }

}