Jak rejestrować dane z czujników ruchu systemu Android w stałym tempie

Uczę się podstaw programowania w Androidzie.

Mam prostą aplikację testową na Androida, w której loguję akcelerometr, magnetometr i dane orientacji do zewnętrznego pliku, jednocześnie wyświetlając go. Rozpoczynam proces rejestrowania po kliknięciu aPoczątek przycisk (registerListener dla odpowiednich czujników) wywołując metodęinitLogger.

Który wygląda na coś podobnego ...

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.... 

Istnieje również przycisk Stop, który zatrzymuje proces rejestrowania (i na koniec wyrejestrowuje się, wywołując unregisterListener dla każdego czujnika)

Proces pobierania danych odbywa się wewnątrzonSensorChanged program obsługi, który pobiera dane z odpowiednich czujników, ustawia wartość odpowiednich elementów interfejsu użytkownika i ostatecznie rejestruje dane w zewnętrznym pliku .csv.

onSensorChanged Eventhandler wygląda mniej więcej tak ...

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 ....

Chociaż odbieram dane ze wszystkich skonfigurowanych czujników, nie mam kontroli nad szybkością odbierania danych. to znaczy

Wiem, że zdarzenie SensorChanged jest uruchamiane, gdy dane czujnika zostaną zmienione. Jednak chcę, aby to wydarzenie było uruchamiane ze stałą stawką.Na przykład: co 40ms

Pytanie:

Jak upewnić się, że zdarzenie SensorChanged jest uruchamiane ze stałą szybkością?Czy w tym przypadku klasa TimerTask w Javie ma jakąkolwiek pomoc?

Eksperci tutaj w SO.Proszę mi pomóc :)

questionAnswers(5)

yourAnswerToTheQuestion