Cómo registrar datos desde sensores de movimiento de Android a una tasa fija

Estoy aprendiendo los fundamentos de la programación de Android.

Tengo una sencilla aplicación de prueba de Android en la que registro el acelerómetro, el magnetómetro y los datos de orientación en un archivo externo y también los muestro. Inicié el proceso de registro al hacer clic de unacomienzo botón (registerListener para sensores relevantes) llamando a un métodoinitLogger.

Que se parece algo a esto ...

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

También hay un botón Detener, que detendrá el proceso de registro (y, finalmente, anular el registro llamando a unregisterListener para cada sensor)

El proceso de recuperación de datos ocurre dentro de laonSensorChanged el controlador que recuperará los datos de los sensores relevantes, establece el valor en los elementos de la interfaz de usuario respectivos y finalmente registra los datos en un archivo .csv externo.

onSensorChanged manejador de eventos se ve algo como esto ...

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

Aunque recibo los datos de todos los sensores configurados, no tengo control sobre la velocidad a la que se reciben los datos. es decir

Sé que el evento SensorChanged se activa cuando se modifican los datos del sensor. Sin embargo, quiero que este evento se dispare a una tasa fija.Por ej: cada 40ms

Pregunta:

¿Cómo asegurar que el evento SensorChanged se dispara a una velocidad constante?¿Es la clase TimerTask en Java de alguna ayuda en este caso?

Expertos aquí en SO. Por favor, ayúdame :)

Respuestas a la pregunta(5)

Su respuesta a la pregunta