Я изучаю основы программирования для 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....
Также есть кнопка «Стоп», которая должна остановить процесс регистрации (и, наконец, отменить регистрацию, вызвав 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 ....
Хотя я получаю данные от всех настроенных датчиков, я не могу контролировать скорость получения данных. то есть
Я знаю, что событие SensorChanged запускается при изменении данных датчика. Однако я хочу, чтобы это событие запускалось с фиксированной скоростью. Например: каждые 40 мс
Вопрос:
- Как обеспечить, чтобы событие SensorChanged запускалось с постоянной скоростью?
- Поможет ли в этом случае класс TimerTask на Java?
Эксперты здесь, в SO. Пожалуйста, помогите мне :)