如何在Android中每X秒打印一次加速计值
我想每3秒钟打印一次加速计值。这是到目前为止我的代码如何在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
@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秒钟后打印所有值,并且在传感器类型检查之外进行临时检查是不正确的,因为这些值不会更新。在此期间