Android: L'exception Leaked IntentReceiver est levée même si j'appelle unregisterReceiver
Je ne comprends pas pourquoi je me fais de cette exception au moment de frapper le bouton de retour. J'ai le IntentReceiver inscrit dans la méthode onCreate et il est censé être enregistrées dans la méthode onPause. Mon Journal.w() appeler à l'intérieur de la méthode onPause m'amène à croire que le unregisterReceiver() la méthode est appelée, mais j'obtiens cette exception encore.
Toutes les pensées?
private PlayerReceiver playerReceiver;
public void onCreate(Bundle savedInstanceState) {
...
IntentFilter playerFilter;
playerReceiver = new PlayerReceiver();
playerFilter = new IntentFilter(PlayerService.BUFFERING_FAILURE);
playerFilter.addAction(PlayerService.BUFFERING_SUCCESS);
registerReceiver(playerReceiver, playerFilter);
...
}
protected void onPause() {
...
if (playerReceiver != null){
unregisterReceiver(playerReceiver);
Log.w(TAG, "playerReceiver has been unregistered");
playerReceiver = null;
}
...
}
public class PlayerReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(PlayerService.BUFFERING_FAILURE)){
setListenButton(false);
}
closePlayDialog();
}
}
LogCat Sortie
08-26 11:44:28.646: WARN/WWOZMain(1058): playerReceiver has been unregistered
08-26 11:44:29.476: ERROR/ActivityThread(1058): Activity org.wwoz.WWOZMain has leaked IntentReceiver org.wwoz.WWOZMain$PlayerReceiver@43e4dd60 that was originally registered here. Are you missing a call to unregisterReceiver()?
08-26 11:44:29.476: ERROR/ActivityThread(1058): android.app.IntentReceiverLeaked: Activity org.wwoz.WWOZMain has leaked IntentReceiver org.wwoz.WWOZMain$PlayerReceiver@43e4dd60 that was original
ly inscrit ici. Êtes-vous en manque un à l'appel à unregisterReceiver()?
source d'informationauteur Doug Miller
Vous devez vous connecter pour publier un commentaire.
C'est un Android activité du cycle de vie de question. Je suis de le voir dans une activité principale, puis de le tester sur l'appareil avec le bouton de retour qui remonte à un écran de démarrage.
Dans le
onPause()
méthode.Annuler l'inscription de l'
BroadcastReceiver
que vous avez créé dans laonCreate()
Dans le
onRestart()
ré-enregistrer une nouvelle marque de Récepteur de Radiodiffusion.Dans la classe d'activité vous avez besoin de garder une trace de l'Récepteur de Radiodiffusion en tant que données d'instance membre.
DEUXIÈME
Je pense que c'est aussi une fonction d'amélioration de problème avec Android.
Parfois développeur a besoin d'un récepteur de radiodiffusion à survivre à l'activité. Par exemple, pour comprendre quand certains états d'écran sont disponibles ou pas. Penser à une conversation cadre de travail modèle de flux, qui possède de nombreux états.
TROISIÈME
Vous pouvez enregistrer et désenregistrer des récepteurs de radiodiffusion à une activité, mais un simple appel comme
isRegistered(BroadcastReceiver)
dans l'Activité de classe peut être très utile.Si vous avez besoin de récepteurs à vivre au-delà de l'activité, alors je n'ai pas la réponse, sauf dans le silence de l'avertissement, en ajoutant
unregister(X)
dans leonDestroy()
appel. YMMV 😉J'ai eu exactement le même problème.
La cause est que j'ai, par inadvertance, enregistré le même BroadcastReceiver deux fois.
Ma situation était similaire avec Mullins, je me suis inscrit à un récepteur à la fois classe et de ses sous-classe.
Pour les débutants comme moi, il suffit de basculer d'un point d'arrêt à votre
receiver
puis le débogage de votre application. Si le récepteur est quelque chose commecom.example.main.listener.MyRecevier@421c0100
tandis que le journal des erreurs dans le logcat est différent d'elle, commecom.example.main.listener.MyRecevier@4202fb40
avec les caractères après le "@" différents, certainement vous avez enregistré deux fois (ou plus).(Ci-dessus aime un commentaire sous Mullins " réponse, en fait, je poste ici parce que je ne peux pas poster des commentaires maintenant.)