2011-05-07 3 views
20

pmkeepScreenOn 변수가 전역 적으로 정의됩니다. 나는 나의들의 OnDestroy, onPause 및 중지시에WakeLock은 아직 개최 중입니다.

if (keepScreenOn == null) { 
    keepScreenOn = pm.newakeLock(PowerManager,SCREEN_BRIGHT_LOCK,"tpd"); 
} 
keepScreenOn.acquire(); 

와 잠금을 잡아 onRestart 내 ONSTART, onResume에서

pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
keepScreenOn = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_LOCK,"tpd"); 

및 :

나는 내에서 OnCreate 방법에 PowerManager.WakeLock을 잡아 나는 다음과 같이 자물쇠를 풀어 준다 :

if (keepScreenOn != null) { 
    keepScreenOn.release(); 
    keepScreenOn = null 
} 

내 앱이 종료 된 후 실패 화면이 나타나고 compl AINS 그

의 java.lang.Exception : TPD

추적 내가 종료 전에 잠금을 해제 있음을 보여줍니다 여전히 유지하면서 가동 잠금 확정. 내가 무엇을 놓쳤는가? 방법은 적어도 onPause 중 하나 onStop, 또는 onDestroy을 횡단하지 않고 응용 프로그램에서이 없습니다

. 나는 release()이라는 앱을 acquire()라고 불렀다는 것을 알 수있다. 따라서 wakelock이 참조 카운트 된 경우에도 여전히 0 개의 참조가 있어야한다.

+0

문제와 관련이 없지만 너무 많은 곳에서 잠금을 설정하고 해제하는 이유는 무엇입니까? onResume 및 onPause에서만 실행하지 않는 이유는 무엇입니까? – Olegas

+0

나는 그것을 시험해 보았다. 그런 다음 모든 onXXX 루틴을 추적했습니다. 그런 다음 나는 그것을 추가했다 –

+0

'keepScreenOn' 변수가 클래스에서 한 번만 선언 되었습니까? 범위가 작은 다른 선언이 있습니까 (예 : 메소드에서 선언 됨). – Olegas

답변

0

아니요, 전역 범위에서 하나의 선언 만 있으며 은 해당 범위에서 acquire() 및 release()를 호출합니다. I 이 발생하고 acquire()가 한 번 발생하고 릴리스가 한 번 발생하면 println이 발생합니다.

27

좋아요. 문제가 발견 된 것 같습니다.

WakeLock은 참조 횟수입니다. 즉, 두 번째 acquire() 이 발생하면 참조 횟수가 증가합니다. acquire() 요구에 대한 모든 호출은 같이 isHeld()의 호출에 의해 보호되어야합니다 :

if ((keepScreenOn != null) &&   // we have a WakeLock 
    (keepScreenOn.isHeld() == false)) { // but we don't hold it 
    keepScreenOn.acquire(); 
} 

나는 열린 잠금 acquire() 그렇게 아무것도하지 않았다 여러 acquire() 호출이 문제가 발생한다고 가정했다. 참조 카운트가 0이 아니기 때문에 GC는 오류를 발생시킵니다.

관련 문제