Bizarre “Destinataire non enregistré” exception
Dans onResume() je fais:
registerReceiver(timeTickReceiver, new IntentFilter(Intent.ACTION_TIME_TICK));
et dans onPause():
unregisterReceiver(timeTickReceiver);
Je vois "java.lang.IllegalArgumentException: Récepteur non inscrit" rapports sur l'Android Developer Console (il y a seulement 2 rapports et de mon application a des milliers d'utilisateurs). L'exception est déclenchée par unregisterReceiver(). Ce qui peut se passer? Je ne me sens pas très confiance juste l'entourer de try-catch.
- Sur quelle version de l'API est-ce possible?
- Je ne sais pas, je ne peux pas voir que, dans les rapports d'erreur.
- Je suppose que sur certains téléphones, la
onResume
événement n'est pas toujours invoquée aprèsonCreate
qui à son tour provoque des problèmes dans la premièreonPause
pour cette activité. - J'aurais tendance à être d'accord avec Xion, mais pas un problème avec un téléphone... au Lieu de cela, je pense que c'est plus un très spécifique bord de cas, comme la rotation de l'orientation au bon moment, au début de l'activité du cycle de vie (quelque part très proche de onCreate et onResume). Les anciennes versions de la plate-forme ont des problèmes similaires avec des boîtes de dialogue, ViewFlippers, et d'autres widgets, particulièrement au cours de la rotation, donc je ne suis pas surpris qu'il allait se passer ici aussi. Semble que votre code est correct, donc je dirais juste attraper l'exception.
Vous devez vous connecter pour publier un commentaire.
Nous avons vu cette erreur lorsque vous faites un appui long sur un écran, et puis tout de suite à faire des changements d'orientation (par exemple, tournez l'appareil à l'envers).
L'API docs pour unregisterReceiver dit:
Il n'est pas dit explicitement, mais comme vous l'avez vu, vous frappez
IllegalArgumentException: Receiver not registered
si elle n'est pas déjà inscrit.La solution que j'utilise est de stocker mon Récepteur en tant que membre de champ, et l'ont mis à null quand il n'est pas inscrit, c'est à dire que je l'initialiser à null, et uniquement quand je l'enregistrer. Cela pourrait ne pas être parfait, mais il résoudre mon plantages!
De mon onServiceConnected:
De mon onServiceDisconnected:
Un récepteur de radiodiffusion devrait être annuler l'inscription dans le
onPause()
cycle de vie de la méthodeJe pense qu'il y a peut-être certains états où le récepteur n'est pas enregistré avant par exemple, un utilisateur quitte l'application.
Vous voudrez peut-être essayer d'ajouter une case pour le récepteur avant l'exécution d'annuler l'inscription, (je l'ai fait dans plusieurs cas):
L'option la plus simple serait pour envelopper bloc try/catch autour du code.
Un
BroadcastReceiver
doivent être enregistrés dans leonCreate()
cycle de vie de la méthode:Et un
BroadcastReceiver
doivent être enregistrées dans leonDestory()
cycle de vie de la méthode:Cela permettra d'éviter le scénario de l'annulation de l'inscription d'un
BroadcastReceiver
qui n'a pas encore été enregistrée.