【问题标题】:Sensor data is written multiple times when using Asynctask使用 Asynctask 时多次写入传感器数据
【发布时间】:2017-08-31 13:22:21
【问题描述】:

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

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

}

【问题讨论】:

  • 请添加您的异步任务代码。
  • class save_IMU extends AsyncTask { protected Void doInBackground(Void... params) { if (MainActivity.is_recording) { // 创建文件夹名称 store_data(); } 返回空值; } protected void onPostExecute(布尔保存) { } };
  • 这里是 Asynctask 任务中的 mu 代码,抱歉代码乱了,我不知道如何把它们说清楚。

标签: android android-asynctask android-sensors


【解决方案1】:

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

您的 asynctask 从 bufferData 数组中读取共享数据,每次传感器值更改时都会覆盖该数组。 AsyncTask 在您调用 execute 方法的那一刻没有启动。它被放入队列中,然后等待执行空闲线程。所以它可能需要同样的时间才能运行。写入存储可能比您需要的要慢,因此队列将填满,并且可以在两个 onSensorChanged 调用之间运行更多任务。如您所见,他们可以写入多个相等的行。

我的建议:

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

【讨论】:

  • 你能详细说明如何使用处理程序发送缓冲区数据,我已经搜索过,但不太了解如何在我的情况下应用。
【解决方案2】:

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

您应该使用new save_IMU(bufferData ); 将缓冲区传输到异步任务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    相关资源
    最近更新 更多