SensorEventListener
在单独线程中的技术解析SensorEventListener
是 Android 传感器框架的核心接口,用于监听设备传感器(如加速度计、陀螺仪、光线传感器等)的数据变化。其定义如下:
public interface SensorEventListener {
void onSensorChanged(SensorEvent event); // 传感器数据变化时触发
void onAccuracyChanged(Sensor sensor, int accuracy); // 传感器精度变化时触发
}
onSensorChanged
和 onAccuracyChanged
回调默认在 主线程(UI 线程) 执行。如果传感器数据更新频繁(如高频率的加速度计),可能阻塞 UI 渲染,导致卡顿。SensorManager
直接指定线程SensorManager sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
HandlerThread sensorThread = new HandlerThread("SensorThread");
sensorThread.start();
Handler handler = new Handler(sensorThread.getLooper());
// 注册监听器时指定 Handler
sensorManager.registerListener(
sensorEventListener,
sensor,
SensorManager.SENSOR_DELAY_NORMAL,
handler
);
private final ExecutorService sensorExecutor = Executors.newSingleThreadExecutor();
private SensorEventListener sensorEventListener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
sensorExecutor.execute(() -> {
// 在子线程处理传感器数据
processSensorData(event.values);
});
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// 精度变化处理(可选)
}
};
runOnUiThread
或 Handler
。sensorThread.quit()
)。HandlerThread
)。onPause()
或 onDestroy()
中调用 unregisterListener()
。public class SensorActivity extends AppCompatActivity {
private SensorManager sensorManager;
private HandlerThread sensorThread;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sensor);
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sensorThread = new HandlerThread("SensorThread");
sensorThread.start();
sensorManager.registerListener(
new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
Log.d("Sensor", "x=" + x + ", y=" + y + ", z=" + z);
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {}
},
sensor,
SensorManager.SENSOR_DELAY_NORMAL,
new Handler(sensorThread.getLooper())
);
}
@Override
protected void onDestroy() {
super.onDestroy();
sensorManager.unregisterListener(this);
sensorThread.quit();
}
}
通过上述方法,可以安全高效地在子线程中处理传感器数据。
没有搜到相关的文章