2015-03-11 1 views
20

J'ai un service qui devrait être exécuté en arrière-plan. Il démarre lorsque mon application est ouverte et se termine chaque fois que mon application est désactivée par l'utilisateur.WakeLock a été finalisé alors que je l'ai libéré même si je le relâche

Chaque fois que mon application est en arrière-plan ou lorsque l'écran est éteint, le service doit toujours être activé.

J'ai atteint ce avec un WakeLock, mais pour une raison quelconque, je reçois l'erreur dans le titre. Ceci est préoccupant parce que je pourrais être la fuite de la mémoire WakeLock (si je comprends bien).

Je suis capable de déclencher l'erreur en redémarrant mon application.

Voici le code correspondant:

public class SomeService extends Service { 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     super.onStartCommand(intent, flags, startId); 

     PowerManager manager = (PowerManager) getSystemService(POWER_SERVICE); 

     mWakeLock = manager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "TAG"); 

     if (!mWakeLock.isHeld()) mWakeLock.acquire(); 

     //Handle other processing 

     return START_STICKY; 
    } 

    @Override 
    public void onDestroy() { 

     if (mWakeLock.isHeld()) mWakeLock.release(); 
     super.onDestroy(); 
    } 

} 

Je suis perplexe parce que dans mon onDestroy() je libère le WakeLock. Je ne suis pas sûr de ce qui déclenche l'erreur.

+1

Je suis également confronté au même problème. Donc, vous avez trouvé une solution? –

+1

Avez-vous essayé de déplacer la création du verrou vers 'onCreate()'? – iosdude

+0

@iosdude J'ai essayé, mais c'est la même chose. – Pitel

Répondre

6

Service.onStartCommand() peut être appelé plusieurs fois avant Service.onDestroy(), car ils ne représentent pas les événements/états 'opposés' (voir docs). Vous pouvez acquérir plusieurs verrous (et perdre la référence au verrou acquis précédemment à chaque fois), mais lorsque vous avez terminé le service/fermeture de l'application, vous ne libérez que le dernier.

+0

Mais qu'est-ce que je reçois le wakelock dans la méthode 'OnCreate()'? C'est ce que je fais, mais je reçois toujours l'erreur. – Pitel

+0

@Pitel, pouvez-vous poster votre code? (bien que vous pourriez avoir besoin de créer une nouvelle question, puisque c'est probablement un problème connexe mais différent) –

+0

Voici mon code: http://pastebin.com/zQTBuvaw – Pitel