Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java WakeLock没有';不要总是释放_Java_Android_Wakelock_Android Wake Lock - Fatal编程技术网

Java WakeLock没有';不要总是释放

Java WakeLock没有';不要总是释放,java,android,wakelock,android-wake-lock,Java,Android,Wakelock,Android Wake Lock,我最近重新构建了应用程序的电源管理部分,以降低复杂性。其中的变化是重新使用wakelocks;具体地说,线程在创建时接收唤醒锁,然后根据需要获取/释放它,直到终止。我发现这会导致唤醒锁在调用release()时并不总是释放。导致问题的代码本质上如下所示: // Get the lock for the first time, acquire it, and do some work. WakeLock wakelock = receiveFirstWakeLock(); wakelock.acq

我最近重新构建了应用程序的电源管理部分,以降低复杂性。其中的变化是重新使用wakelocks;具体地说,线程在创建时接收唤醒锁,然后根据需要获取/释放它,直到终止。我发现这会导致唤醒锁在调用
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!");
我的问题是:

  • 还有其他人遇到过这种情况吗
  • wakelocks是否打算以这种方式重用
  • 如果对#2是,这是一个bug吗
  • 如果对#2为否,我是否在文档中的某个地方遗漏了这一点

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

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

    您确定第二个doWork()不会阻塞并因此阻止执行发布吗?你的Wakelock使用什么标志?它肯定不会阻塞——即使在比这复杂得多的完整代码中(这是一个工作循环)。始终到达第二个wakelock.release()。它只是有时不释放,但它似乎总是在第一次到达时释放。我使用的是部分唤醒锁定。您确定第二个doWork()不会阻塞并因此阻止执行释放吗?你的Wakelock使用什么标志?它肯定不会阻塞——即使在比这复杂得多的完整代码中(这是一个工作循环)。始终到达第二个wakelock.release()。它只是有时不释放,但它似乎总是在第一次到达时释放。我用的是部分唤醒锁。