循环加速度计数据计算Android SDK

时间:2016-05-12 09:06:28

标签: java android arraylist accelerometer apache-commons

我已经在使用应用程序进行跌倒检测已经有一段时间了。该应用程序运行,但有时会冻结,然后恢复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();
}

0 个答案:

没有答案