Search code examples
androidandroid-asynctaskaccelerometerandroid-sensors

How to handle live data of Accelerometer in android?


I need to perform Dynamic Time Wrapping(DTW) algorithm with some previously stored data and Accelerometer data. But I am unable to handle the huge amount of data coming from accelerometer. I need to determine a step. In order to do that I have stored a number of data previously and trying to match with the current data.

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;
    }

But I am getting huge data coming from the sensor. My question is how do I handle this data and match with a sample data continuously. Also I have tested with a Log.d, I'm sure the problem is related to how I handle this Live data but I can't find a way out. Any suggestion would be helpful.
I have also tried this by doing it an interval of 2 sec but an OutOfMemeoryBoundsException throws

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

Solution

  • One of the solution to address this problem is keeping a threshold for the change in the sensor values. If the change in deltaX, deltaY, deltaZ are greater then you can start the AsyncTask else dont.

    Since u are not keeping any threshold values the number of threads u create is very huge in number.

    EDIT 1:

    Here is a link to a small tutorial that will help you to kick start... in this link he has used a time interval and a threshold for shaking the device... i bet this is a perfect solution for your requirement

    Tutorial Link