Я написал приложение для Android 7 для хранения сенсорных данных моего смартфона в базе данных SQLite. Например, для акселерометра я получаю следующие значения:
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
Sensor mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_UI);
public final void onSensorChanged(SensorEvent event) {
long timeNano = System.nanoTime();
long timeMilli = System.currentTimeMillis();
// Save to database
}
Как можно видеть, при каждом вызове onSensorChanged
(т.е. когда поступает новое значение датчика), я также извлекаю и сохраняю текущую временную метку в миллисекундах и наносекундах. Я думаю, что получение этих временных меток всегда занимает некоторое время (десятки миллисекунд). У меня довольно высокая частота дискретизации датчиков.
Это проблема, когда я получаю метку времени для каждого полученного значения датчика? Меня беспокоит только то, что я добавляю искусственные задержки (постановку в очередь) к значениям датчика в том случае, если значения датчика поступают быстрее, чем получение миллисекундной и наносекундной отметок времени.
Во-вторых, я также хочу сбросить файл /dev/input/event7
(на /dev/input/event7
телефоне). Я могу либо сохранить его непосредственно в базе данных (как с данными датчика), либо просто скопировать его в текстовый файл.
Какой из них лучше, и есть ли вероятность того, что текстовый файл может быть поврежден (например, если он не был правильно закрыт в конце или когда произошла ошибка записи)? Я думаю, что база данных безопасна и всегда должна быть в согласованном состоянии.
SENSOR_DELAY_UI
= 60 000 микросекунд = 60,0 миллисекунд задержки.
Мы не можем быть уверены в скорости получения меток времени. На дорогих устройствах это может занять 10 миллисекунд. На дешевых устройствах может быть 100 миллисекунд.
Кроме того, хранение данных в базе данных/файле добавляет много миллисекунд, как и загрузка нового потока для офшорного процесса.
Краткое напоминание: не забывайте, что указанная вами задержка является только рекомендуемой задержкой, поэтому задержка может быть ниже указанной задержки. Источник
Итак: это может быть не проблема для вашего сверхбыстрого ультрафона получить эти временные метки, так как это достаточно быстро, чтобы получить временную метку и сохранить ее в базе данных/файле, но это может быть проблемой на других, более медленных телефонах.
Вы получите пробелы в ваших чтениях. Если один вызов onSensorChanged()
занимает, например, 10 секунд, и каждые 50 микросекунд функция является заданной задержкой, то будет происходить вызов между каждыми 10 секундами и каждые 10 секунд плюс 50 микросекунд.
Вы можете принять тот факт, что вам иногда приходится "пропускать" onSensorChanged()
. Чтобы снизить вероятность этого, вы можете указать большую задержку. Вы можете указать пользовательское время задержки в микросекундах с помощью mSensorManager.registerListener(this, mAccelerometer, 1000*1000);
На ваш второй вопрос: я не знаю много о рутированных телефонах, но я знаю о файлах.
Считывание /dev/input/event7 и сохранение его в базе данных, вероятно, займет больше времени, чем быстрая запись содержимого в какой-либо текстовый файл, если это все еще означает быструю работу.
Повреждение текстового файла произойдет, если у вас есть 2 операции записи, записывающие в 1 файл одновременно. Вы должны всегда закрывать свой первый выходной поток перед открытием второго. Обычно при обнаружении ошибок записи всегда закрывайте outputtream. Делая эти 2 вещи, убедитесь, что нет повреждения файлов.
В целом верно, что запись в базу данных безопаснее, чем запись в текстовый файл, поскольку базы данных предназначены для обработки нескольких записей, потенциально опасных записей и т.д.