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:

  • Convertir ForeignCollection en ArrayList - ORMLite, Gson y Android
  • Deshabilitar un ImageButton
  • Android: ¿puedo usar Google Analytics dentro de un servicio?
  • Obtener permiso error java.lang.SecurityException: Permiso de denegación en 3.x dispositivos Android al obtener el nombre del archivo adjunto de correo electrónico
  • ¿El navegador web de Android permite subir fotos tomadas de la cámara?
  • Problemas de memoria en fragmentos que muestran imágenes
  •  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.

  • ¿Cómo activar el botón "Compartir" en la aplicación Android?
  • ¿Cómo puedo agregar elementos a una ruleta en Android?
  • Artículos de Android ListView que no llenan el ancho
  • Android: Theme Holo versión anterior
  • ¿La implementación de Android de SecureRandom produce números aleatorios verdaderos?
  • Cómo pasar valores entre fragmentos
  • 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.