【问题标题】:WakeLock finalized while still heldWakeLock 在仍然举行的情况下完成
【发布时间】:2011-05-07 11:42:12
【问题描述】:

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 在仍被持有时完成:tpd

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

如果不通过至少一个,就无法退出应用程序 onPauseonStoponDestroy。我可以看到该应用程序调用了 release() 经常调用 acquire() 所以即使 唤醒锁是引用计数的,它仍然应该有零引用。

【问题讨论】:

  • 可能和你的问题无关,但是为什么你在这么多地方创建和释放锁?为什么不只在 onResume 和 onPause 时这样做?
  • 我试过了。然后我跟踪了每个 onXXX 例程。然后我添加了它
  • 你的keepScreenOn 变量在一个类中只声明一次吗?是否还有其他一些范围较小的声明(即在方法中声明)。
  • 我倾向于使用WakeLock.acquire(5000),其中 5,000 是超时,或者您希望的另一个超时。这种方法似乎一直有效。而没有超时的WakeLock.acquire() 会意外地导致WakeLock 在仍被持有时完成。这是一个碰巧的事情。如果您不想编写自己的 WakeLock 实现,请查看 CommonsWare 的 WakeLock library。还不错。

标签: android android-activity wakelock


【解决方案1】:

好的,我相信我找到了问题。

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 会抛出错误。

【讨论】:

    【解决方案2】:

    我知道这个问题很老,但请记住,WakeLocks 默认是“引用计数”的。您可以使用setReferenceCounted(boolean) 关闭引用计数,请参阅http://developer.android.com/reference/android/os/PowerManager.WakeLock.html#setReferenceCounted(boolean)

    【讨论】:

      【解决方案3】:

      不,在全局范围内只有一个声明,并且所有 对 acquire() 和 release() 的调用发生在该范围内。一世 println 当它们发生并且 acquire() 发生一次并且 释放发生一次。

      【讨论】:

        猜你喜欢
        • 2013-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多