2017-08-31 76 views
1

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

} 
+0

请添加您的asynctask代码。 –

+0

class save_IMU extends AsyncTask protected void doInBackground(Void ... params)if(MainActivity.is_recording){ //创建文件夹名称 store_data(); } return null; } protected void onPostExecute(布尔保存){ } }; – trinamntn08

+0

这里mu代码在Asynctask任务,对于错误的代码抱歉,我不知道如何把它们清楚。 – trinamntn08

回答

0

的AsyncTask是不是你的问题很好的选择。

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

我的建议:

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

你可以精确地说明如何使用处理程序来发送bufferdata,我已经搜索了一下,但并不真正了解如何申请我的情况。 – trinamntn08

0

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

您应该将缓冲区转移到new save_IMU(bufferData);的asynctask。

相关问题