OnSensorChanged прекращает случайный сбор данных

У меня есть приложение WearOS, которое собирает данные об акселерометре, гироскопе, частоте сердечных сокращений и шагах. Приложение должно собирать данные каждые 250 миллисекунд. Он делает это хорошо, но делает случайные паузы и прекращает сбор данных, а затем возобновляет. Я уверен, что буду двигать часы во время тестирования. На этом изображении видно, что он прекратил сбор данных примерно на 7 секунд. Посмотрите на отметку времени справа

Я не уверен, что вызывает это. Вот мой код ниже

@Override
public void onCreate() {
    super.onCreate();
    Log.d(TAG, "onCreate");


    t1 = new Timer();
    t2 = new Timer();
    t3 = new Timer();
    t4 = new Timer();
    Log.d(TAG, "onCreate: Creating thread");
    HandlerThread thread = new HandlerThread("SensorServiceThread", Process.THREAD_PRIORITY_BACKGROUND);
    thread.start();
    Log.d(TAG, "onCreate: Finished creating thread");

    mServiceLooper = thread.getLooper();
    mServiceHandler = new ServiceHandler(mServiceLooper);

    Util.initTimeStamps(this);
}

private void initSensor(){
    sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);

    registerListeners();
}


private void registerListeners(){

    sensorManager.registerListener(this,
            sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
            (int)Const.SENSOR_DATA_MIN_INTERVAL*1000, SENSOR_QUEUE_LATENCY);

    sensorManager.registerListener(this,
            sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE),
            (int)Const.SENSOR_DATA_MIN_INTERVAL*1000, SENSOR_QUEUE_LATENCY);


    sensorManager.registerListener(this,
            sensorManager.getDefaultSensor(Sensor.TYPE_HEART_RATE),
            (int)Const.SENSOR_DATA_MIN_INTERVAL*1000, SENSOR_QUEUE_LATENCY);

    sensorManager.registerListener(this,
            sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER),
            (int)Const.SENSOR_DATA_MIN_INTERVAL*1000, SENSOR_QUEUE_LATENCY);
}


@Override
public void onSensorChanged(SensorEvent event) {

    if(flag){
        flag = false;

        switch(event.sensor.getType()){
            case Sensor.TYPE_ACCELEROMETER:
            processAccelerometerData(event);
            //Log.d("acc","Acc Works");

            break;

            case Sensor.TYPE_GYROSCOPE:
            processGyroData(event);

            //Log.d("gyro","Gyro Works");
            break;

            case Sensor.TYPE_STEP_COUNTER:


            float[] values = event.values;

            float x = values[0];
            Log.e("step", String.valueOf(x));
            steppre = (int) x;

            processStepData(event);
            Log.d("step","steps work 2");

            break;

            case Sensor.TYPE_HEART_RATE:
            //check if sensor is not in touch with user or sensor status itself is unreliable, then ignore!
            if(event.accuracy == SensorManager.SENSOR_STATUS_NO_CONTACT || event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE)
                return;

            processHeartRateData(event);


            break;


            default:
            Log.d(TAG, "onSensorChanged:: "+event.values[0]);


        }
    }
}

person ARK    schedule 17.03.2021    source источник


Ответы (1)


Вы должны зарегистрировать и отменить регистрацию слушателей следующим образом.

   @Override
    public void onResume() {
        super.onResume();
        sensorManager.registerListener(this,
                sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                (int)Const.SENSOR_DATA_MIN_INTERVAL*1000, SENSOR_QUEUE_LATENCY);

        sensorManager.registerListener(this,
                sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE),
                (int)Const.SENSOR_DATA_MIN_INTERVAL*1000, SENSOR_QUEUE_LATENCY);


        sensorManager.registerListener(this,
                sensorManager.getDefaultSensor(Sensor.TYPE_HEART_RATE),
                (int)Const.SENSOR_DATA_MIN_INTERVAL*1000, SENSOR_QUEUE_LATENCY);

        sensorManager.registerListener(this,
                sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER),
                (int)Const.SENSOR_DATA_MIN_INTERVAL*1000, SENSOR_QUEUE_LATENCY);

    }

    @Override
    public void onPause() {
        super.onPause();
        //and unregister the listeners here
    }
person Eyosiyas    schedule 17.03.2021