我開發的Android應用,這將寫出的時間戳和3軸加速度計傳感器數據(時間戳,AX,AY,AZ)爲CSV文件。首先遇到的兩個問題是,少量條目的時間戳不是按升序排列在文件中的(請參閱圖像中黃色突出顯示的時間戳)。 書寫加速度計傳感器數據到文件是無序
二是,我收到許多條目單個時間戳(不重複的條目),理想情況下,我們應該得到的只是一個獨特的時間戳一個條目。
我的應用程序的設計是:我創建將在後臺運行的服務和所有的傳感器數據記錄到文件中。我使用ZipOutputStream來封裝BufferedOutputStream和FileOutputStream以將傳感器數據寫入文件。以下是AccelerometerLoggingService
的代碼片段。我正在關閉onDestroy()
服務方法中的文件。你能告訴我什麼可能是我的代碼或設計中可能存在的缺陷。我認爲線程可能存在一些問題,但我不知道如何調試它。任何幫助表示讚賞。
public class AccelerometerLoggingService extends Service {
class AccelerometerEventLoggerTask extends AsyncTask<Acceleration, Void, Void> {
@Override
protected Void doInBackground(Acceleration... accelerations) {
Acceleration acc = accelerations[0];
writeAcceleration(acc);
return null;
}
}
class AccelerometerSensorListener implements SensorEventListener {
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER)
return;
Acceleration acc = new Acceleration(System.currentTimeMillis(),
event.values[0],
event.values[1],
event.values[2]);
new AccelerometerEventLoggerTask().execute(acc);
}
}
}
writeAcceleration(Acceleration acc) {
zipOutputStream.write(acc.toString().getBytes());
}
//
ZipOutputStream zipOutputStream = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(logFile)));
更新2:
我認爲這個問題是因爲線程同步的。因此,我決定在單獨的後臺線程上運行加速度傳感器,並將傳感器數據寫入同一線程中的文件,但仍然在我的文件中出現亂序條目。以下是我所做的新代碼更改。
public void startAccelerometer() {
// creating new thread for onSensorChanged method to run
handlerThread = new HandlerThread("AccelerometerSensorThread");
handlerThread.start();
handler = new Handler(handlerThread.getLooper());
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
mAccelerometerSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mSensorManager.registerListener(this, mAccelerometerSensor, SensorManager
.SENSOR_DELAY_GAME, handler);
}
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER)
return;
Acceleration acc = new Acceleration(System.currentTimeMillis(),
event.values[0],
event.values[1],
event.values[2]);
accelerometerLogger.writeAcceleration(acc); // writing sensor data to file
Log.d(TAG, "onSensorChanged Thread name " + Thread.currentThread().getName()); // AccelerometerSensorThread
}
public void stopAccelerometer() {
// first unregister the sensor listener then stop the thread
mSensorManager.unregisterListener(this);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
handlerThread.quitSafely();
} else {
handlerThread.quit();
}
}
是午睡。問題是'System.currentTimeMillis()'可能會被網絡提供者改變。現在我正在使用獨立於用戶時鐘的'SystemClock.elapsedRealTime()'。 –
你能詳細解釋一下嗎?它會給你絕對時間(unix時間)還是相對時間(啓動時間)? –