gpt4 book ai didi

android - WakeLock 在仍然举行的情况下完成

转载 作者:IT老高 更新时间:2023-10-28 23:11:10 28 4
gpt4 key购买 nike

pmkeepScreenOn 变量是全局定义的。

我在 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

跟踪显示我在退出前释放了锁。我错过了什么?

如果不通过至少一项,就无法退出应用程序onPauseonStoponDestroy。我可以看到该应用程序调用了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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com