使用Asynctask时,传感器数据会被多次写入

时间:2017-08-31 13:22:21

标签: android android-asynctask android-sensors

我编写了一个应用程序来将传感器数据保存到文件中。目标是以100 Hz的速度保存IMU数据。 我使用Asynctask作为存储部分。一切似乎都很好;但是当我在文件中看到值时,会有很多次写入的数据。你有什么想法:

enter image description here

    @Override
public final void onSensorChanged(SensorEvent event) {

    //timestamp = (new Date()).getTime() + (event.timestamp - System.nanoTime()) / 1000000L;
    timestamp = new Date().getTime();
    // Handle accelerometer reading
    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {

        bufferData[0] = event.values[0];
        bufferData[1] = event.values[1];
        bufferData[2] = event.values[2];

    }
    // Handle a gyro reading
    else if (event.sensor.getType() == Sensor.TYPE_GYROSCOPE) {

        bufferData[3] = event.values[0];
        bufferData[4] = event.values[1];
        bufferData[5] = event.values[2];
    }

       save_IMU save_imu = new save_IMU();
        save_imu.execute(); 

}

2 个答案:

答案 0 :(得分:0)

AsyncTask不是您的问题的好选择。

你asynctask从bufferData数组中读取共享数据,每当传感器值发生变化时,该数据就会被覆盖。在调用execute方法时,AsyncTask不会启动。它被放入队列,而不是等待执行自由线程。因此它可能需要相同的时间才能运行。写入存储可能比您需要的速度慢,因此队列将填满,并且可以在两个onSensorChanged调用之间运行更多任务。如你所见,他们可以写出多个相等的行。

我的建议:

  1. 为测量值创建队列/缓冲区。在onSensorChanged
  2. 中添加新项目
  3. 定期(例如每250ms)使用Handler检查缓冲区并将项目写入磁盘(运行时更多)。如果您不想尝试处理程序,也可以使用AsyncTask。

答案 1 :(得分:0)

bufferData应该是onSensorChanged()函数的局部变量。

您应该使用new save_IMU(bufferData );将缓冲区传输到asynctask。