Dyl*_*les 1 java android android-wake-lock wakelock
我最近重建了应用程序的电源管理部分以降低复杂性.其中的变化是重复使用唤醒锁; 具体而言,线程在创建时接收唤醒锁,然后根据需要获取/释放它直到被杀死.我发现这会导致唤醒锁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!");
Run Code Online (Sandbox Code Playgroud)
我的问题是:
我想我发现了发生了什么事.根据WakeLock文档,默认情况下,唤醒锁需要平均数量的调用acquire()和release().如果没有发生这种情况,release()实际上不会释放锁定.我的代码具有嵌套任务,这些任务使用相同的唤醒锁进行微睡眠目的.比如,如果其中一个获取唤醒锁,而不是它再次释放它,那么在返回控制链中的更高级别之前(例如,如果发生了不正确处理的中断),那么锁永远不会释放!我发现了这一点,通过观察setReferenceCounted()和WakeLock.toString(),后者会告诉你多少次acquire()被称为无平衡release().希望这可以帮助遇到类似问题的其他人!