Ich entwickle eine Android-App, die die Zeitstempel und 3-Achsen-Beschleunigungssensor-Daten (timestamp, ax, ay, az) in eine CSV-Datei schreiben wird. Ich bekomme zuerst zwei Probleme, weil der Zeitstempel einiger Einträge nicht in aufsteigender Reihenfolge in der Datei geschrieben ist (siehe den gelb markierten Zeitstempel im Bild). Schreiben von Beschleunigungssensor Daten in Datei ist außer Betrieb
Zweite ist, dass ich viele Einträge für einen einzigen Zeitstempel bin immer (nicht die doppelten Einträge), im Idealfall sollten wir nur einen einzigen Eintrag für einen einzigartigen Zeitstempel bekommen.
Das Design meiner App ist: Ich erstelle einen Dienst, der im Hintergrund läuft und alle Sensordaten in eine Datei speichert. Ich verwende ZipOutputStream, der BufferedOutputStream und FileOutputStream zum Schreiben von Sensordaten in die Datei umschließt. Unten ist das Code-Snippet von AccelerometerLoggingService
. Ich schließe die Datei in onDestroy()
Methode des Dienstes. Können Sie mir vorschlagen, was die möglichen Fehler in meinem Code oder Design sein können? Ich denke, es kann ein Problem mit Threading geben, aber ich weiß nicht, wie man es debuggt. Jede Hilfe wird geschätzt.
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)));
Update 2:
Ich dachte, das Problem, weil der Thread-Synchronisation war. Deshalb habe ich mich entschieden, den Beschleunigungssensor auf einem separaten Hintergrund-Thread laufen zu lassen und Sensordaten in die Datei im selben Thread zu schreiben, aber immer noch bekomme ich keine Einträge in meinen Dateien. Unten sind die neuen Codeänderungen, die ich gemacht habe.
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();
}
}
ja Nickerchen. Das Problem liegt bei 'System.currentTimeMillis()', das vom Netzwerkanbieter geändert werden kann. Jetzt verwende ich 'SystemClock.elapsedRealTime()', das unabhängig von der Uhr des Benutzers ist. –
Können Sie bitte die Zeit näher erläutern? Gibt es die absolute Zeit (Unix-Zeit) oder relative Zeit (Uptime vom Start)? –