Одновременно можно получать данные только от одного датчика, и датчики могут передавать данные через разные промежутки времени.
Есть несколько способов подойти к этому.
Простейшим было бы кэширование значений для каждого датчика, а затем всякий раз, когда вы получаете новые данные для любого датчика, вы обновляете кэшированное значение для этого датчика, а затем записываете новую строку CSV со всеми значениями кэшированного датчика. Эта новая линия CSV будет отличаться от предыдущей только для датчика 1, данные которого вы только что обновили.
(Pseudo-code)
onSensorChanged(SensorEvent event) {
//Note: in practice, you need to copy the values out of the event.values array
//using, for example, System.arraycopy
cached_values[event.sensor.getType()] = event.values;
writeCsvLine(cached_values);
}
В качестве альтернативы, вместо записи строки CSV каждый раз, когда вы получаете часть данных, вы можете кэшировать значения датчика до тех пор, пока не получите «дубликат» - то есть данные для датчика, для которого у вас уже есть неписанные данные. Затем вы должны записать строку CSV для кэшированных значений, сбросить флаги is_written для каждого датчика и обновить кэшированное значение для только что полученного датчика. Таким образом, у вас не будет столько дублирующих значений в CSV-файле, но вы все равно гарантированно не пропустите ни одно из сообщенных значений датчика.
(Pseudo-code)
onSensorChanged(SensorEvent event) {
if (!cached_value_written[event.sensor.getType()]) {
writeCsvLine(cached_values);
cached_values_written.reset(); //reset all flags to true
}
cached_values[event.sensor.getType()] = event.values;
cached_value_written[event.sensor.getType()] = false;
}
Еще один подход состоит в том, чтобы кэшировать значения датчиков по мере их получения, а затем в отдельном потоке вы будете собирать «текущие» значения, скажем, 1 секунду, и записывать их. При таком подходе необходимо соблюдать осторожность при синхронизации доступа к кэшированным значениям, поскольку вы будете читать и писать в отдельных потоках.
(Pseudo-code)
onSensorChanged(SensorEvent event) {
synchronized(cached_values) {
cached_values[event.sensor.getType()] = event.values;
}
}
//on a separate thread:
run() {
while (true) {
Thread.sleep(1000);
synchronized(cached_values) {
writeCsvLine(cached_values);
}
}
}
Или, вместо того, чтобы иметь отдельный поток, который проверяет каждую 1 секунду, вы можете сохранить время, когда вы в последний раз записывали значения, а затем, когда вы получите новое значение, проверьте, если 1 секунда (или любой другой интервал, который вы хотите использовать) с момента последней записи данных, и если да, напишите новую строку CSV с текущими кэшированными значениями.
(Pseudo-code)
onSensorChanged(SensorEvent event) {
long currentTime = System.currentTimeMillis();
cached_values[event.sensor.getType()] = event.values;
if (currentTime - lastWrittenTime >= 1000) {
writeCsvLine(cached_values);
lastWrittenTime = currentTime;
}
}