问题描述
我有一个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
}