引言:近期在项目上遇到一个“FLP”问题。 本文借此问题来分析:同一个sensor被多个App监听SensorEventListener事件时,app client被"First flush Pending"问题;
1. App Java层的常规步骤
private void registerListener() {
Log.d(TAG, "registerListener");
mAccel = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mGyro = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE_UNCALIBRATED);
mSensorManager.registerListener(mSensorEventListener, mAccel,
SENSOR_DELAY_NORMAL, SENSOR_DELAY_NORMAL, mHandler);
mSensorManager.registerListener(mSensorEventListener, mGyro,
SENSOR_DELAY_NORMAL, SENSOR_DELAY_NORMAL, mHandler);
}
2. registerListener()函数
App侧调用的registerListener()接口,将会调用 SensorManager中的相应接口。进而调用SystemSensorManager中的registerListenerImpl()接口。
public boolean registerListener(SensorEventListener listener, Sensor sensor,
int samplingPeriodUs, int maxReportLatencyUs, Handler handler) {
int delayUs = getDelay(samplingPeriodUs);
return registerListenerImpl(listener, sensor, delayUs, handler, maxReportLatencyUs, 0);
}
3. registerListenerImpl()函数
从代码上看:
①. Sensor Events的种类有:REPORTING_MODE_CONTINUOUS、REPORTING_MODE_ON_CHANGE、REPORTING_MODE_ONE_SHOT三种类型;
②. 在SystemSersorManager中,最多的Listerner Client数量为128个;
③. 获取SensorEventQueue,执行addSensor()操作;
protected boolean registerListenerImpl(SensorEventListener listener, Sensor sensor,
int delayUs, Handler handler, int maxBatchReportLatencyUs, int reservedFlags) {
if (listener == null || sensor == null) {
Log.e(TAG, "sensor or listener is null");
return false;
}
// Trigger Sensors should use the requestTriggerSensor call.
if (sensor.getReportingMode() == Sensor.REPORTING_MODE_ONE_SHOT) {
Log.e(TAG, "Trigger Sensors should use the requestTriggerSensor.");
return false;
}
if (maxBatchReportLatencyUs < 0 || delayUs < 0) {
Log.e(TAG, "maxBatchReportLatencyUs and delayUs should be non-negative");
return false;
}
if (mSensorListeners.size() >= MAX_LISTENER_COUNT) { // MAX_LISTENER_COUNT:128
throw new IllegalStateException("register failed, "
+ "the sensor listeners size has exceeded the maximum limit "
+ MAX_LISTENER_COUNT);
}
// Invariants to preserv