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:

  • RecyclerView.Adapter.notifyItemChanged () nunca pasa la carga útil a onBindViewHolder ()
  • AndroidStudio - Dependencias de módulos en Gradle
  • Editar texto que muestra el subrayado rojo en el texto
  • Captura todas las excepciones de tipo de programación de Android
  • ¿Es posible acceder al Fragmento actual que está siendo visualizado por un ViewPager?
  • ¿Cómo puedo actualizar el cursor desde un CursorLoader?
  •  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.

  • Async Task Ocurrió un error al ejecutar doInBackground ()
  • SeekBar en un NavigationDrawer
  • ¿Cómo leer / enviar datos con el dispositivo Android 3.5mm jack auriculares?
  • Android 5.0: cómo cambiar el color de título de las aplicaciones recientes?
  • ¿Cómo crear Android Key Hash de Facebook?
  • Cuándo utilizar los cargadores de Android
  • 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.