Это продолжение к моему вопросу здесь: Android thread runnable performanceAndroid синхронизирован onSensorChanged?
У меня возникли некоторые трудности, обертывание моей головы вокруг синхронизированных метод для моего приложения
Я опрашивает датчики и хранение значений датчиков в массивы, когда они изменить
float[] accelerometerMatrix = new float[3];
float[] accelerometerWorldMatrix = new float[3];
float[] gyroscopeMatrix = new float[3];
float[] gravityMatrix = new float[3];
float[] magneticMatrix = new float[3];
float[] rotationMatrix = new float[9];
class InsertHandler implements Runnable {
public void run() {
//get values from arrays and insert into db
}
}
public void onSensorChanged(SensorEvent event) {
sensor = event.sensor;
int i = sensor.getType();
if (i == MainActivity.TYPE_ACCELEROMETER) {
accelerometerMatrix = event.values;
} else if (i == MainActivity.TYPE_GYROSCOPE) {
gyroscopeMatrix = event.values;
} else if (i == MainActivity.TYPE_GRAVITY) {
gravityMatrix = event.values;
} else if (i == MainActivity.TYPE_MAGNETIC) {
magneticMatrix = event.values;
}
long curTime = System.currentTimeMillis();
long diffTime = (curTime - lastUpdate);
// only allow one update every POLL_FREQUENCY.
if(diffTime > POLL_FREQUENCY) {
lastUpdate = curTime;
//insert into database in background thread
executor.execute(insertHandler);
}
}
каждые 10мс, мое приложение будет принимать текущие значения датчиков (из массивов) и вставить их в базу данных, используя один поток исполнителя. Таким образом, метод onSensorChanged
одновременно писать к массивам, и чтение из массивов записи в базу данных
Мой вопрос, если метод onSensorChanged
быть синхронизированы?
Самое главное, что я не пропущу никаких данных. Каждые 10 мс мне нужно сохранить текущие значения датчика - ни один из них не может быть пропущен.
Как я понимаю, синхронизированный метод означает, что поток пользовательского интерфейса будет содержать блокировку, и он будет записывать значения датчиков в массивы. За это время поток исполнителей не может читать из этих массивов из-за блокировки. Затем блокировка отменяется, а поток исполнителей блокируется, считывается из массивов и записывается в базу данных, освобождается блокировка
Возможно, я ошибаюсь в использовании синхронных методов, особенно учитывая, что onSensorChanged
- это событие, и я не уверен как это играет в этом
Но, похоже, что в такой ситуации я не могу вставлять самые последние значения каждые 10 мс. Когда поток пользовательского интерфейса устанавливает блокировку, поток исполнителя не может записать эти значения в базу данных. К тому моменту, когда поток исполнителей может писать, значения теперь будут несколько мс старых и неточно
С другой стороны, синхронизация будет означать, что у меня нет ситуаций, когда поток пользовательского интерфейса меняет значения массива, а на в то же время поток исполнителей вставляет половину измененных значений в базу данных
Итак, для такого типа ситуаций, когда мне нужно вставлять самые последние/точные данные датчика каждые 10 мс, следует ли использовать синхронизированный метод?