Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Android中每X秒打印一次加速计值_Android_Multithreading_Delay_Accelerometer - Fatal编程技术网

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

如何在Android中每X秒打印一次加速计值,android,multithreading,delay,accelerometer,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

我想每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);                        
        }

    }

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

我不太熟悉
postDelayed
,但我会冒险猜测,
run
的每个调用都延迟了3秒,但是每个延迟都是并行计算的,可以说,您希望他们按顺序延迟

根据调用SensorChanged的频率,您最好检查自上次调用以来经过的时间,如果>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);                        
        }
    }
}

我个人会为此使用一个线程,你可以在onCreate中启动它,这样它就会一直运行,而不是等到onSensorChanged发生时才启动

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

您需要从SensorChanged()上删除处理程序,以便它能够持续运行。现在,只有当您的传感器读数发生变化时,它才会执行。另外,您需要添加一个调用以再次运行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);

当前代码所做的是等待传感器发生变化,然后等待3秒并打印

如果您想每3秒钟打印一次,则需要在打印完成后重新发布runnable。postDelayed只是在执行之前延迟,当您完成打印后,您需要启动另一个3秒的“计时器”

请点击此处:


在runnable本身的run方法中有一个对postDelayed(runnable)的调用。

如果在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();
        }
    }

}

是否要打印它们,而不管它们是否更改?是的,并且每3秒您需要将处理程序从OnSensorChanged移动一次写入无限for循环,并在那里设置3秒的延迟,因此每次执行for循环都会延迟3个部分。这只执行
printValue()
一次。谢谢,它适用于我的情况,对于这种情况,我正在使用您的解决方案,谢谢:DNope,这将在3秒钟后打印所有值,并且在传感器类型检查之外进行临时检查是不正确的,因为这些值不会更新。在此期间