2017-08-31 1 views
1

センサーデータをファイルに保存するアプリを作成します。目標は100Hzの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

クラスsave_IMU AsyncTask { } {Void doInBackground(Void ... params){ if(MainActivity.is_recording){ //フォルダ名を作成 store_data(); } return null; } protected void onPostExecute(ブール保存){ } }; – trinamntn08

+0

ここでは、Asynctaskタスクのmuコードです。混乱したコードで申し訳ありませんが、私はそれらをはっきりと記述する方法はわかりません。 – trinamntn08

答えて

0

AsyncTaskは、あなたの問題のために良い選択ではありません。

asynctaskは、センサー値が変更されるたびにオーバーライドされるbufferData配列から共有データを読み取ります。 AsyncTaskは、executeメソッドを呼び出した瞬間に開始されません。キューに入れられ、空きスレッドが実行されるのを待っています。だから、実行する前に同じ時間がかかることがあります。ストレージへの書き込みが必要以上に遅くなり、2つのonSensorChanged呼び出しの間にキューがいっぱいになり、より多くのタスクを実行できるようになります。表示されているように複数の等しい行を書き込むことができます。

私の提案:

  1. は、測定値のキュー/バッファを作成します。 onSensorChangedで新しい項目を追加する
  2. Handlerを使用して定期的に(たとえば250msごとに)チェックバッファを作成し、項目をディスクに書き込む(実行時にはさらに多く)。ハンドラを試したくない場合は、AsyncTaskを使ってハンドラを実行することもできます。
+0

バッファーデータを送信するためにハンドラーを使用する方法を正確に知ることができますが、私はそれについて検索しましたが、私の場合にはどのように適用するのかを実際に理解していません。 – trinamntn08

0

bufferDataは、onSensorChanged()のローカル変数である必要があります。

new save_IMU(bufferData);でバッファをasynctaskに転送する必要があります。

関連する問題