所以我试图分析传感器的一些数据。我希望数组列表“填满”数据,然后在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();
}
答案 0 :(得分:0)
首先&#34;同步&#34;,如果您想在从传感器获取数据时处理数据,可能会发生冲突。你应该知道这一点
其次,在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();
}
答案 1 :(得分:0)
回答我自己的问题。我已经初始化了一个时间变量lastUpdate
,它现在有时间,然后将它与现在的时间进行比较,如果这是有意义的,如果差异大约为500,我会进行数据处理。我从这篇文章中得到了这个想法:
How to log data from Android Motion Sensors at a fixed rate
long curTime = System.currentTimeMillis();
if ((curTime - lastUpdate) >= 500){
lastUpdate = curTime;
checkSpikes(xAxisValues, yAxisValues, zAxisValues);
xAxisValues = new ArrayList<>();
yAxisValues = new ArrayList<>();
zAxisValues = new ArrayList<>();
}