因此,我正在尝试分析传感器的一些数据。我希望数组列表可以用数据"填充",然后在500ms之后,将其删除并处理它的线程。似乎该线程仅执行一次(我知道那是应该发生的事情(,但是我不知道有一种方法可以在500ms睡觉的情况下多次执行它。我尝试使用 while(true)
, lock
, handler
, timer
,但无处可去。
public void onSensorChanged(SensorEvent sensorEvent) {
if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
accSensorVals = lowPass(sensorEvent.values.clone(), accSensorVals);
}
xAxisValues.add(accSensorVals[0]); // [0] - X axis
yAxisValues.add(accSensorVals[1]); // [1] - Y axis
zAxisValues.add(accSensorVals[2]); // [2] - Z axis
new Thread() {
public void run() {
try {
Thread.sleep(DELAY); // delay for 500 ms
checkSpikes(xAxisValues, yAxisValues, zAxisValues);
xAxisValues = new ArrayList<>();
yAxisValues = new ArrayList<>();
zAxisValues = new ArrayList<>();
} catch (Exception e) {}
}
}.start();
}
首先,"同步",如果您想在传感器中获取数据时处理数据,则可能会发生冲突。您应该意识到这一点。
其次,在Android中使用服务来收集传感器数据。检查此链接https://developer.android.com/guide/components/services.html
您共享的当前线程仅运行一次,您应该在线程内创建一个循环。
public void onSensorChanged(SensorEvent sensorEvent) {
if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
accSensorVals = lowPass(sensorEvent.values.clone(), accSensorVals);
}
xAxisValues.add(accSensorVals[0]); // [0] - X axis
yAxisValues.add(accSensorVals[1]); // [1] - Y axis
zAxisValues.add(accSensorVals[2]); // [2] - Z axis
new Thread() {
public void run() {
try {
while(true){
checkSpikes(xAxisValues, yAxisValues, zAxisValues);
xAxisValues = new ArrayList<>();
yAxisValues = new ArrayList<>();
zAxisValues = new ArrayList<>();
Thread.sleep(DELAY); // delay for 500 ms
}
} catch (Exception e) {}
}
}.start();
}
,或者,如果您想暂停收集并仅处理数据,则应该执行这样的操作:
private boolean fetch = true;
public void onSensorChanged(SensorEvent sensorEvent) {
if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
accSensorVals = lowPass(sensorEvent.values.clone(), accSensorVals);
}
xAxisValues.add(accSensorVals[0]); // [0] - X axis
yAxisValues.add(accSensorVals[1]); // [1] - Y axis
zAxisValues.add(accSensorVals[2]); // [2] - Z axis
new Thread() {
public void run() {
try {
while(true){
if(fetch){
checkSpikes(xAxisValues, yAxisValues, zAxisValues);
xAxisValues = new ArrayList<>();
yAxisValues = new ArrayList<>();
zAxisValues = new ArrayList<>();
Thread.sleep(DELAY); // delay for 500 ms
}
}
} catch (Exception e) {}
}
}.start();
}
回答我自己的问题。我已经初始化了一个时间变量lastUpdate
,该变量现在有时间,然后现在将其与时间进行比较,如果有意义,并且如果差异约为500,则我进行数据处理。我从这篇文章中得知:
如何以固定速率从Android运动传感器登录数据
long curTime = System.currentTimeMillis();
if ((curTime - lastUpdate) >= 500){
lastUpdate = curTime;
checkSpikes(xAxisValues, yAxisValues, zAxisValues);
xAxisValues = new ArrayList<>();
yAxisValues = new ArrayList<>();
zAxisValues = new ArrayList<>();
}