WakeLock并不总是发布

时间:2013-09-01 22:05:08

标签: java android wakelock android-wake-lock

我最近重建了应用的电源管理部分以降低复杂性。其中的变化是重复使用唤醒锁;具体而言,线程在创建时接收唤醒锁,然后根据需要获取/释放它直到被杀死。我发现这会导致在调用release()时并不总是释放的唤醒锁。导致问题的代码在本质上是在这里给出的:

// Get the lock for the first time, acquire it, and do some work.
WakeLock wakelock = receiveFirstWakeLock();
wakelock.acquire();
doWork();

// When work is finished, release the lock. 
// Typically this lock is released very quickly.
wakelock.release();

// Re-acquiring the lock for the next bout of work always works.
wakelock.acquire();
doWork();

// In my full code, "wakelock" didn't appear to be releasing properly.
// I hypothesized that it might just be taking a little while 
// so I tried this to see how long it would take. 
// I found that it sometimes *never* releases!
wakelock.release();
while (wakelock.isHeld())
  Thread.yield();
Log.d("Test","Released the lock!");

我的问题是:

  1. 还有其他人遇到过这个吗?
  2. 唤醒锁是否意味着以这种方式重复使用?
  3. 如果是#2,这是一个错误吗?
  4. 如果不是#2,我是否在文档的某处错过了这个?

1 个答案:

答案 0 :(得分:5)

我想我发现了发生了什么事。根据{{​​1}}文档,默认情况下,唤醒锁需要对WakeLockacquire()进行均衡的调用。如果没有发生这种情况,release()实际上不会释放锁定。我的代码具有嵌套任务,这些任务使用相同的唤醒锁进行微睡眠目的。比如,如果其中一个获得了唤醒锁,而不是它再次释放它,那么在返回控制链中的更高级别之前(例如,如果发生了不正确处理的中断),那么锁永远不会被释放!我通过查看release()setReferenceCounted()找到了这一点,后者将告诉您在没有平衡WakeLock.toString()的情况下调用acquire()的次数。希望这可以帮助遇到类似问题的其他人!