최근 응용 프로그램의 전원 관리 섹션을 다시 작성하여 복잡성을 줄였습니다. 변화 중에는 wakelocks의 재사용이있었습니다. 특히 스레드는 생성시 wakelock을 수신 한 다음 필요에 따라 스레드를 제거 할 때까지 획득/해제합니다. 나는이 결과가 release()
이 호출 될 때 항상 해제되지 않는 wakelocks를 발견했다. 그 본질에서 문제가 발생 코드는 여기에 주어진 :WakeLock이 항상 출시되는 것은 아닙니다
- 은 다른 사람이이 발생했습니다 : 당신에
// 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!");
내 질문?
- 이러한 방식으로 wakelock을 다시 사용할 수 있습니까?
- 예 # 2 인 경우 버그입니까?
- # 2에 없다면 문서의 어딘가에 이것을 놓쳤습니까?
두 번째 doWork()가 차단되어 릴리스를 실행하지 못하도록 하시겠습니까? Wakelock에 어떤 플래그를 사용하고 있습니까? – Julien
분명히 차단하지 않습니다. 심지어 전체 코드에서 훨씬 더 복잡합니다 (작업 루프 임). 두 번째 wakelock.release()는 항상 도달합니다. 때로는 풀리지도 않으나, 처음 도달 할 때 항상 풀리는 것처럼 보입니다. PARTIAL_WAKE_LOCK을 (를) 사용하고 있습니다. –