java SensorEventListener不会使用unregisterListener()方法取消注册
我有一个非常简单的Android应用程序:在“活动”中,我有一个按钮,可以启动/停止OrientionListener。然而,在注销之后,在ddms中我仍然可以看到安卓的线程。硬件SensorManager$SensorThread](正在运行)
注册码:
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ORIENTATION);
if (sensors.size() > 0)
{
sensor = sensors.get(0);
running = sensorManager.registerListener(sensorEventListener, sensor, SensorManager.SENSOR_DELAY_FASTEST);
}
和注销:
try
{
if (sensorManager != null && sensorEventListener != null)
{
sensorManager.unregisterListener(sensorEventListener,sensor);
running = false;
}
}
catch (Exception e)
{
Log.w(TAG, e.getMessage());
}
unregisterListener()
方法确实会被执行,但是它不会经常杀死传感器线程,这会持续运行并耗尽电池电量。几个小时后,我的应用程序将耗电20-30%。这怎么可能?如何确保传感器未注册?我在logcat中没有得到任何异常或错误。我尝试在服务中运行侦听器-同样的事情
# 1 楼答案
我也有同样的问题。我检查了Android代码。 相关代码在SensorManager中。爪哇
及
因此,线程似乎应该在不再有侦听器时终止
# 2 楼答案
在我的例子中,为了解决这个问题,我需要纠正我用来获取SensorManager的上下文。我在一家服务公司工作,我需要用这种方式获得SensorManager:
因此,只要证明您使用的SensorManager方法是否正确即可
# 3 楼答案
可能是范围问题。注册和注销sensorEventListener和sensor时,请尝试记录它们的值。(.toString())以确保它们是相同的
# 4 楼答案
您没有显示足够的代码来确定答案,但是您的测试
这根本不准确。也就是说,当您仍然注册为监听时,
sensorManager
或sensorEventListener
可能是null
# 5 楼答案
我也面临类似的问题
停止传感器的解决方法
我使用了一个静态布尔
mIsSensorUpdateEnabled
。当您想停止从传感器获取值时,将其设置为“false”。 在onSensorChanged()方法中,检查布尔变量的值,然后再次调用以注销传感器。这一次,它起作用了。传感器将被取消注册,您将不再使用SensorChanged回调# 6 楼答案
尝试将管理器设置为空
然后在需要的时候再找经理。这应该使线程一致完成(在我的情况下就是这样)。我还没有找到任何解释这种行为的文件,但我很想听听