如何在android中处理Accelerometer的实时数据?

时间:2015-02-20 12:48:05

标签: android android-asynctask accelerometer android-sensors

我需要使用一些先前存储的数据和Accelerometer数据执行动态时间环绕(DTW)算法。但我无法处理来自加速度计的大量数据。我需要确定一个步骤。为此,我先前存储了大量数据并尝试与当前数据匹配。

ArrayList<Double> test=new ArrayList<Double>();

public void onSensorChanged(SensorEvent event) {
   double x=event.value[0];
   double y=event.value[1];
   double z=event.value[2];

   double a=Math.sqrt(x*x+y*y+z*z);
   test.add(a);
   new ProgressRunner().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,x);

private class ProgressRunner extends AsyncTask<Double, Integer, Boolean>
{
   @Override
    protected Boolean doInBackground(Double... params) {
       new Thread(new Runnable() {
            @Override
            public void run() {

        double r=DTWDistance(StepSamples.sample1, standTest);
        if(r<700) /* "Step Detected */
            }
        }).start();
        return null;
    }

但是我从传感器获得了大量数据。我的问题是如何处理这些数据并持续匹配样本数据。我也用Log.d进行了测试,我确定问题与我如何处理这个实时数据有关但我找不到出路。任何建议都会有所帮助 我也试过这个,间隔2秒,但抛出OutOfMemeoryBoundsException

if((System.currentTimeMillis()-sTime)/1000>2){
        new ProgressRunner().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,x);
    }

2 个答案:

答案 0 :(得分:0)

解决此问题的解决方案之一是保持传感器值变化的阈值。如果deltaXdeltaYdeltaZ中的更改较大,则可以启动AsyncTask,否则不会。

由于你没有保留任何阈值,你创建的线程数量非常多。

编辑1:

这是一个小教程的链接,可以帮助你开始......在这个链接中他使用了一个时间间隔和一个阈值来摇动设备...我敢打赌这是一个完美的解决方案,满足你的要求

Tutorial Link

答案 1 :(得分:0)

您是否需要处理每一个值,或者您是否每隔x(例如0.1)秒处理一次?我调用一个检查“now - lastProcessedTime”的方法。如果该值> 100ms,我将处理数据并更新lastProcessedTime = now。如果没有,我将丢弃传感器值。