执行线程onSensorChanged

时间:2017-05-04 10:07:42

标签: java android multithreading android-sensors

所以我试图分析传感器的一些数据。我希望数组列表“填满”数据,然后在500ms后,线程消失并处理它。似乎线程只执行一次(我知道应该发生的事情),但我无法想出一种方法来执行它多次,它睡眠500ms。我尝试使用while(true)lockhandlertimer而无处可去。

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

2 个答案:

答案 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<>();
    }