我想每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);
}
}
它只在应用程序启动时延迟输出,我的错误是什么以及如何解决它?
答案 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();
}
}
}