WakeLock finalisés toujours détenus

La pm et keepScreenOn variables sont globalement définies.

Je prends la PowerManager.WakeLock dans ma méthode OnCreate:

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

dans mon onStart, onResume, et onRestart je prends la serrure avec

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

dans mon onDestroy, onPause, et onStop je libère le verrou avec:

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

Après mon appli quitte-je obtenir une défaillance de l'écran et de la bad se plaint que

java.lang.Exception: WakeLock finalisés encore lieu: dpt

Traçage montre que j'ai sorti le verrou avant de quitter.
Qu'ai-je manqué?

Il n'y a aucun moyen de sortir de l'application, sans les croiser au moins un de
onPause, onStop, ou onDestroy. Je peux voir que l'application appelée
release() aussi souvent qu'il l'appelle acquérir (), donc même si l'
wakelock de référence est comptée, il doit quand même avoir zéro réf.

  • Peut-être il n'est pas lié à ton problème, mais pourquoi de la création et de libérer de verrouillage dans de nombreux endroits? Pourquoi ne pas le faire seulement à onResume et onPause?
  • J'ai essayé aussi. Puis j'ai tracé tous les onXXX routine. Puis je l'ai ajouté
  • Est votre keepScreenOn variable est déclarée qu'une seule fois dans une classe? Est-il des autres déclarations de moindre portée (déclarée dans la méthode).
  • J'ai tendance à utiliser WakeLock.acquire(5000), où 5 000 un délai d'attente, ou un autre délai que vous le souhaitez. Cette méthode semble fonctionner de manière cohérente. Alors que WakeLock.acquire() sans un délai d'attente de façon inattendue peut conduire à des WakeLock finalisés encore tenues. C'est un hit-and-miss de l'affaire. Si vous ne voulez pas écrire votre propre WakeLock mise en œuvre, de prendre un coup d'oeil à CommonsWare de WakeLock bibliothèque. Il n'est pas mauvais.
InformationsquelleAutor Tim Daly | 2011-05-07