La pm y keepScreenOn variables son definidos a nivel global.

Me agarra la PowerManager.WakeLock en mi método OnCreate:

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

en mi onStart, onResume, y onRestart me agarra la cerradura con

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

en mi onDestroy, onPause, y onStop yo libere el bloqueo con:

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

Después de mi app sale tengo un fallo de la pantalla y el bad se queja de que

java.lang.Excepción: WakeLock finalizado, mientras que todavía se mantiene: tpd

De seguimiento muestra que me libera el bloqueo antes de la salida.
¿En qué he faltado?

No hay manera de salir de la aplicación sin la necesidad de cruzar al menos una de
onPause, onStop, o onDestroy. Puedo ver que la aplicación se llama
release() tan a menudo como se llama adquirir() por lo que aunque el
wakelock es un contador de referencias debe tener cero refs.

  • Puede ser que no esté relacionado con su problema, pero ¿por qué son la creación y la liberación de bloqueo en tantos lugares? ¿Por qué no hacerlo sólo en onResume y onPause?
  • He intentado. Luego he seguido todos los onXXX rutina. Luego he añadido
  • Es su keepScreenOn variable se declara sólo una vez en una clase? Hay algunas otras declaraciones con menor alcance (es decir, declarado en el método).
  • Yo tiendo a usar WakeLock.acquire(5000), donde 5.000 es un tiempo de espera, o en otro tiempo de espera que desea. Este método parecía a trabajar de forma constante. Mientras que WakeLock.acquire() sin un tiempo de espera de forma inesperada puede conducir a la WakeLock finalizado, mientras que todavía se mantienen. Es un hit-and-miss asunto. Si usted no desea escribir su propia WakeLock aplicación, echa un vistazo a CommonsWare del WakeLock biblioteca. No está mal.
InformationsquelleAutor Tim Daly | 2011-05-07

3 Comentarios

  1. 29

    Ok creo que he encontrado el problema.

    El WakeLock es un contador de referencias. Eso significa que si un segundo acquire()
    que sucede se acaba de golpe la cuenta de referencia. Cada llamada a acquire()
    debe ser protegido por una llamada a isHeld() como en:

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

    Yo había asumido que acquire() en un bloqueo tuve no hizo nada para
    varios acquire() llamadas causado el problema. Dado que la referencia
    contar no es cero, el GC se produce un error.

  2. 0

    No, No es sólo una declaración en el ámbito global, y todos los
    llamadas a adquirir() y release() se producen en ese ámbito. Yo
    println cuando se producen y el adquirir() se produce una vez y el
    la liberación se produce una vez.

Dejar respuesta

Please enter your comment!
Please enter your name here