У меня есть приложение для Android, которое получает данные от датчика ускорения и датчика вектора вращения с частотой 100 Гц. Он также получает местоположение от GPS каждую 1 секунду. Приложение делает некоторые расчеты на собранные данные по таймеру каждые 10 мс. и сохраняет результаты в CSV-файле и загружает файл в базу данных каждые 3 минуты.
Проблема заключается в том, что в результирующем csv-файле имеется много последовательных повторяющихся значений, даже если прослушиватель местоположения выполняется в отдельном потоке, а прослушиватель датчиков работает в отдельном потоке, а запись в файл и загрузка в Firebase выполняются асинхронно .
Версия приложения для iOS написана с использованием swift примерно с той же процедурой, но не имеет этой проблемы.
mSensorThread = new HandlerThread("Sensor thread", Thread.MAX_PRIORITY);
mSensorThread.start();
Handler mSensorHandler = new Handler(mSensorThread.getLooper());
mSensorManager.registerListener(this, mAccelerometer, 10000,9000,mSensorHandler);
mSensorManager.registerListener(this, mRotationVector, 10000,9000, mSensorHandler);
mLocationThread = new HandlerThread("Location thread", Thread.MAX_PRIORITY);
mLocationThread.start();
Looper looper = mLocationThread.getLooper();
LocationServices.FusedLocationApi.requestLocationUpdates (mGoogleApiClient, mLocationRequest, this, looper).addStatusListener(new PendingResult.StatusListener() {
@Override
public void onComplete(Status status) {
startRecording();
}
});
t.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
// some calculations on sensors data.
}
}, 0, period);
private void writeToCsvFileAndFirebase(final String data, final Date lastDate) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
// write the file and upload to firebase every 3 minuets.
// this function is called from the scheduled timer.
}
});
thread.start();
}