pm
和 keepScreenOn
变量是全局定义的。
我在 OnCreate 方法中获取 PowerManager.WakeLock:
pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
keepScreenOn = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_LOCK,"tpd");
在我的 onStart、onResume 和 onRestart 中,我使用了锁
if (keepScreenOn == null) {
keepScreenOn = pm.newakeLock(PowerManager,SCREEN_BRIGHT_LOCK,"tpd");
}
keepScreenOn.acquire();
在我的 onDestroy、onPause 和 onStop 中,我通过以下方式释放锁:
if (keepScreenOn != null) {
keepScreenOn.release();
keepScreenOn = null
}
在我的应用退出后,我得到一个失败屏幕并且 adb 提示
java.lang.Exception: WakeLock finalized while still held: tpd
跟踪显示我在退出前释放了锁。 我错过了什么?
如果不通过至少一项,就无法退出应用程序
onPause
、onStop
或 onDestroy
。我可以看到该应用程序调用了
release()
和调用 acquire() 一样频繁,所以即使
唤醒锁是引用计数的,它仍然应该有零引用。
最佳答案
好的,我相信我找到了问题。
WakeLock 是引用计数的。这意味着如果第二个 acquire()
发生它只会增加引用计数。每次调用 acquire()
需要通过调用 isHeld()
来保护,如下所示:
if ((keepScreenOn != null) && // we have a WakeLock
(keepScreenOn.isHeld() == false)) { // but we don't hold it
keepScreenOn.acquire();
}
我以为我持有的锁上的 acquire()
什么也没做
多个 acquire()
调用导致了问题。由于引用
count 不为零时 GC 会抛出错误。
关于android - WakeLock 在仍然举行的情况下完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5920798/