Я изучаю основы программирования на Android.
У меня есть простое приложение для тестирования Android, в котором я записываю акселерометр, магнитометр и данные ориентации во внешний файл, а также отображаю его. Я инициирую процесс регистрации нажатием кнопки Начать (registerListener для соответствующих датчиков), вызывая метод initLogger.
Что выглядит похоже на это...
public void initLogger(View view)
{
boolean bFlag = false;
Button btnStart = (Button)findViewById(R.id.btnStartLog);
Button btnStop = (Button)findViewById(R.id.btnStopLog);
btnStart.setEnabled(bFlag);
btnStop.setEnabled(!bFlag);
bEnableLogging = true;
//Start reading the sensor values
sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_UI);
sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_UI);
//so on....
Существует также кнопка Stop, которая останавливает процесс регистрации (и, наконец, отменяет регистрацию, вызывая unregisterListener для каждого датчика)
Процесс поиска данных происходит внутри обработчика onSensorChanged, который должен извлекать данные из соответствующих датчиков, задает значение соответствующим элементам пользовательского интерфейса и, наконец, регистрирует данные во внешнем CSV файле.
onSensorChanged обработчик событий выглядит примерно так:
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
// accelerometer
TextView tAX = (TextView) findViewById(R.id.txtViewAxValue);
TextView tAY = (TextView) findViewById(R.id.txtViewAyValue);
TextView tAZ = (TextView) findViewById(R.id.txtViewAzValue);
// magnetic field
TextView tMX = (TextView) findViewById(R.id.txtViewMx);
TextView tMY = (TextView) findViewById(R.id.txtViewMy);
TextView tMZ = (TextView) findViewById(R.id.txtViewMz);
if (bEnableLogging) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
accelerometerdata = event.values.clone();
tAX.setText(Double.toString(accelerometerdata[0]));
tAY.setText(Double.toString(accelerometerdata[1]));
tAZ.setText(Double.toString(accelerometerdata[2]));
}
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
magneticmatrixdata = event.values.clone();
tMX.setText(Double.toString(magneticmatrixdata[0]));
tMY.setText(Double.toString(magneticmatrixdata[1]));
tMZ.setText(Double.toString(magneticmatrixdata[2]));
}
// so on ....
Хотя я получаю данные от всех сконфигурированных датчиков, у меня нет контроля над скоростью, с которой данные получены. iee
Я знаю, что событие SensorChanged запускается как и когда данные датчика изменены. Однако я хочу, чтобы это событие было запущено с фиксированной скоростью. Например: каждые 40 мс
Вопрос:
- Как обеспечить, чтобы событие SensorChanged запускалось с постоянной скоростью?
- Является ли класс TimerTask в Java какой-либо помощью в этом случае?
Эксперты здесь, в SO.Пожалуйста, помогите мне:)