So protokollieren Sie Daten von Android-Bewegungssensoren mit einer festen Rate

Ich lerne die Grundlagen der Android-Programmierung.

Ich habe eine einfache Android-Testanwendung, in der ich den Beschleunigungsmesser, den Magnetometer und die Ausrichtungsdaten in einer externen Datei protokolliere und sie gleichzeitig anzeige. Ich starte den Protokollierungsprozess mit einem Klick auf aStart Schaltfläche (registerListener für relevante Sensoren) durch Aufruf einer MethodeinitLogger.

Welches sieht so ähnlich aus ...

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

Es gibt auch eine Stopp-Schaltfläche, die den Protokollierungsprozess anhält (und schließlich die Registrierung durch Aufrufen von unregisterListener für jeden Sensor aufhebt).

Der Datenabruf erfolgt innerhalb deronSensorChanged Der Handler, der die Daten von den relevanten Sensoren abrufen soll, setzt den Wert auf die jeweiligen UI-Elemente und protokolliert die Daten schließlich in einer externen CSV-Datei.

onSensorChanged Eventhandler sieht ungefähr so ​​aus ...

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

Obwohl ich die Daten von allen konfigurierten Sensoren erhalte, habe ich keine Kontrolle über die Rate, mit der die Daten empfangen werden. d.h.

Ich weiß, dass das SensorChanged-Ereignis ausgelöst wird, wenn die Sensordaten geändert werden. Ich möchte jedoch, dass diese Veranstaltung zu einem festen Preis abgefeuert wird.Zum Beispiel alle 40ms

Frage:

Wie kann sichergestellt werden, dass das SensorChanged-Ereignis mit konstanter Rate ausgelöst wird?Hilft in diesem Fall die Klasse TimerTask in Java?

Experten hier in SO.Bitte hilf mir :)

Antworten auf die Frage(5)

Ihre Antwort auf die Frage