执行线程OnSensorchanged



因此,我正在尝试分析传感器的一些数据。我希望数组列表可以用数据"填充",然后在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();
}

首先,"同步",如果您想在传感器中获取数据时处理数据,则可能会发生冲突。您应该意识到这一点。

其次,在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();
}

回答我自己的问题。我已经初始化了一个时间变量lastUpdate,该变量现在有时间,然后现在将其与时间进行比较,如果有意义,并且如果差异约为500,则我进行数据处理。我从这篇文章中得知:

如何以固定速率从Android运动传感器登录数据

long curTime = System.currentTimeMillis();
    if ((curTime - lastUpdate) >= 500){
        lastUpdate = curTime;
        checkSpikes(xAxisValues, yAxisValues, zAxisValues);
        xAxisValues = new ArrayList<>();
        yAxisValues = new ArrayList<>();
        zAxisValues = new ArrayList<>();
    }

最新更新