OnSensorChanged 停止随机收集数据

问题描述

我有一个wearOS 应用程序,用于收集加速度计、陀螺仪、心率和步数数据。该应用程序应该每 250 毫秒收集一次数据。它做得很好,但它会随机暂停并停止收集数据然后继续。我一定会在测试时移动手表。 In this image you can see it stopped collecting data for about 7 seconds. Look at the time stamp on the right

我不确定是什么原因造成的。下面是我的代码

@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),SENSOR_QUEUE_LATENCY);


    sensorManager.registerListener(this,sensorManager.getDefaultSensor(Sensor.TYPE_HEART_RATE),sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER),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]);


        }
    }
}

解决方法

您必须按如下方式注册和取消注册侦听器。

   @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),SENSOR_QUEUE_LATENCY);


        sensorManager.registerListener(this,sensorManager.getDefaultSensor(Sensor.TYPE_HEART_RATE),sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER),SENSOR_QUEUE_LATENCY);

    }

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...