У меня есть приложение 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]);
}
}
}