对于我的项目,我创建了一个使用用户设备的传感器来检测北方的类。我只需要每秒钟更新一次,希望延迟更长时间节省一些电池,但我不能让延迟工作。我有什么:
mAcceleroSensor = mSensorManagerAccelero.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
mMagneticSensor = mSensorManagerMagnetic.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
// Tried to set normal values like SensorManager.SENSOR_DELAY_NORMAL
// and numbers like 100 - 100.000. 1.0000.0000
// (without the dots only here to make it readable here).
mSensorManagerAccelero.registerListener(this, mAcceleroSensor, 50000000);
mSensorManagerMagnetic.registerListener(this, mMagneticSensor, 50000000);
一切正常,除了延迟它几乎看起来像它的更新现场。我已经使用代码similair来https://stackoverflow.com/a/23060896/1667868进行一些改动。
注意:我使用的最小api版本为14
答案 0 :(得分:2)
SensorManager.registerListener(SensorEventListener listener, Sensor sensor, int samplingPeriodUs)
的文档:
事件将在可用时立即传递给提供的SensorEventListener。为了降低功耗,应用程序可以使用registerListener(SensorEventListener,Sensor,int,int),并指定正的非零最大报告延迟。
虽然传感器的读数以给定的间隔进行采样,但未指定该方法中的报告间隔,从而导致在读数可用时立即快速调用回调。使用文档中提到的替代方法:
mSensorManagerAccelero.registerListener (this, mAcceleroSensor, 1000000, 1000000)
让它在大约一秒左右报告(您可以根据需要手动调整采样率)。这也有助于用电。
请注意,文档声称最终参数maxReportLatencyUs
是:
在报告给应用程序之前可以延迟事件的最长时间(以微秒为单位)。
意味着它可能仍然会以超过1秒的速度报告。如果您希望用户看到一致的平滑1秒更新,请考虑将结果保存到平均缓冲区并每秒更新一次UI。