我已经在使用应用程序进行跌倒检测已经有一段时间了。该应用程序运行,但有时会冻结,然后恢复10-15秒后。 我的方法是进行积分计算(这意味着我必须导入第三方库:Apache Commons)。对于这些积分计算,我需要标准值。 我在传感器更新时调用了一种计算范数的方法:
public void onSensorChanged(SensorEvent event){
acceleration.setText("\n " + event.values[0] + " , " + event.values[1] + " , " + event.values[2] + " \n");
x = event.values[0];
y = event.values[1];
z = event.values[2];
if (!checkFall)
sample(x, y, z);
}
调用示例函数会使应用程序运行缓慢(通过在UI上设置文本可见)。
示例似乎是我问题的根源,如下所示:
private void sample(double x, double y, double z)
{
if(xList.size() < 120 && yList.size() < 120 && zList.size() < 120)
{
xList.add(x);
yList.add(y);
zList.add(z);
}
if(xList.size() == 120)
{
for (int j = 0; j < norm.length; j++)
{
norm[j] = sqrt(pow(xList.get(j), 2) + pow(yList.get(j), 2) + pow(zList.get(j), 2));
for(int p = 0; p < norm.length-1; p++)
{
for(int q = 0; q < diff.length; q++)
{
diff[q] = norm[p] - norm[p+1];
}
}
if (norm[j]/9.81 < 0.5)
{
final counterClass timer = new counterClass(4000, 20, norm, diff);
checkFall = true;
timer.start();
// if exceeded three times, save the arrayList and register fall
}
}
(我已经尝试在if语句规范[j] /9.81&lt; 0.5已经满足时禁用定时器调用,因为我认为错误可能在倒数计时器正在调用的函数中) - 但是没有任何帮助,只要规范接近0,应用程序就会冻结。
logcat中没有明显的错误,这就是为什么我很难缩小错误所在的位置。也许我以一种可怕的方式访问阵列?
如果您希望我提供任何遗漏的信息,或者我的问题过于模糊,请告知我们。
编辑:
专柜类
public counterClass(long millisInFuture, long countDownInterval, double[] norm, double[] diff) {
super(millisInFuture, countDownInterval); // Duration & how often onTick should be called
nor = norm;
dif = diff;
}
public void onTick(long millisUntilFinished) {
listFall(); // Adding accelerometer data to fall list array List each time its called
new Thread(new Runnable() {
@Override
public void run() {
vCheck(nor,dif);
}
}).start();
}