2017-08-31 77 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。

相關問題