Как записывать данные с Android Motion Sensors с фиксированной скоростью

Я изучаю основы программирования на Android.

У меня есть простое приложение для тестирования Android, в котором я записываю акселерометр, магнитометр и данные об ориентации во внешний файл, а также отображаю его. Я запускаю процесс регистрации нажатием кнопки Start (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 мс

Вопрос:

  1. Как обеспечить запуск события SensorChanged с постоянной скоростью?
  2. Помогает ли в этом случае класс TimerTask в Java?

Эксперты здесь, в SO.Пожалуйста, помогите мне:)

10
задан Lal 29 October 2015 в 18:01
поделиться