Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


WakeLock finalizado mientras se mantiene

Las variables pm y keepScreenOn se definen globalmente.

Tomo el 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 tomo el candado con

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

En mi onDestroy, onPause y onStop suelto el bloqueo con:

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

Después de las salidas de mi aplicación obtengo una pantalla de error y adb se queja

Java.lang.Exception: WakeLock finalizado mientras aún se mantiene: tpd

El rastreo muestra que solté la cerradura antes de salir. ¿Qué he extrañado?

No hay forma de salir de la aplicación sin cruzar al menos uno de onPause , onStop o onDestroy . Puedo ver que la app llamada release() tan a menudo como se llama acquire () así que aunque el wakelock es referencia contada debe tener todavía cero refs.

  • Iluminar la pantalla cuando la notificación recibió android
  • WakeLock bajo bloqueo GCM_LIB
  • ¿Cómo desactiva Android Wear cuando está en modo de suspensión?
  • Corregir el patrón para adquirir un WakeLock en un BroadcastReceiver y liberarlo en un servicio
  • Android - Wake lock no se está adquiriendo correctamente, la aplicación debe seguir funcionando en modo de espera
  • Uso de WakeLock para mantener una reproducción en secuencia
  • Pantalla tenue mientras el usuario está inactivo
  • ¿Es posible tener varias cerraduras de la estela?
  • 3 Solutions collect form web for “WakeLock finalizado mientras se mantiene”

    Ok, creo que encontré el problema.

    El WakeLock es la referencia contada. Esto significa que si ocurre un segundo acquire() acaso, sólo golpeará el recuento de referencia. Cada llamada a acquire() necesita ser protegida 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(); } 

    Había asumido que la acquire() en una cerradura que llevé a cabo no hizo nada tan múltiple acquire() llamadas de la acquire() causaron el problema. Dado que el recuento de referencia no es cero, el GC genera un error.

    Sé que esta pregunta es antigua, pero tenga en cuenta que WakeLocks son 'referencia contada' por defecto. Puede desactivar el recuento de referencias utilizando setReferenceCounted(boolean) , consulte http://developer.android.com/reference/android/os/PowerManager.WakeLock.html#setReferenceCounted(boolean)

    No, sólo hay una declaración en el ámbito global y todas las llamadas a la () y la adquisición () se producen en ese ámbito. I println cuando ocurren y el acquire () ocurre una vez y el lanzamiento ocurre una vez.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.