J'ai certaines des exceptions suivantes:
java.lang.IllegalArgumentException: View not attached to window manager
at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:355)
at android.view.WindowManagerImpl.updateViewLayout(WindowManagerImpl.java:191)
at android.view.Window$LocalWindowManager.updateViewLayout(Window.java:428)
at android.app.Dialog.onWindowAttributesChanged(Dialog.java:596)
at android.view.Window.setDefaultWindowFormat(Window.java:1013)
at com.android.internal.policy.impl.PhoneWindow.access$700(PhoneWindow.java:86)
at com.android.internal.policy.impl.PhoneWindow$DecorView.drawableChanged(PhoneWindow.java:1951)
at com.android.internal.policy.impl.PhoneWindow$DecorView.fitSystemWindows(PhoneWindow.java:1889)
at android.view.ViewRoot.performTraversals(ViewRoot.java:727)
at android.view.ViewRoot.handleMessage(ViewRoot.java:1633)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4338)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
at dalvik.system.NativeStart.main(Native Method)
Je l'ai googlé et j'ai vu que cela avait quelque chose à voir avec les popups et la rotation de l'écran, mais il n'y a aucune référence à mon code.
Les questions sont:
- existe-t-il un moyen de savoir exactement quand ce problème se produit?
- autre que de tourner l'écran, y a-t-il un autre événement ou action qui déclenche cette erreur?
- comment éviter que cela se produise?
View#onAttachedToWindow()
avoir été appelée?Réponses:
J'ai eu ce problème où, lors d'un changement d'orientation de l'écran, l'activité s'est terminée avant la tâche AsyncTask avec la boîte de dialogue de progression terminée. J'ai semblé résoudre ce problème en définissant la boîte de dialogue sur null
onPause()
, puis en vérifiant cela dans AsyncTask avant de rejeter.... dans ma AsyncTask:
la source
Après un combat avec ce problème, je me retrouve enfin avec cette solution de contournement:
Parfois, une bonne gestion des exceptions fonctionne bien s'il n'y avait pas de meilleure solution pour ce problème.
la source
Si vous avez un
Activity
objet qui traîne, vous pouvez utiliser laisDestroyed()
méthode:C'est bien si vous avez une sous-
AsyncTask
classe non anonyme que vous utilisez à divers endroits.la source
J'utilise une classe statique personnalisée qui crée et masque une boîte de dialogue. cette classe est utilisée par d'autres activités non seulement une seule activité. Maintenant, le problème que vous avez décrit m'est également apparu et j'ai passé la nuit pour trouver une solution.
Enfin je vous présente la solution!
si vous souhaitez afficher ou fermer une boîte de dialogue et que vous ne savez pas quelle activité a déclenché la boîte de dialogue afin de la toucher, le code suivant est pour vous.
la source
La solution ci-dessus n'a pas fonctionné pour moi. Donc, ce que j'ai fait, c'est prendre
ProgressDialog
comme global et ensuite l'ajouter à mon activitéde sorte que dans le cas où l'activité est détruite, ProgressDialog sera également détruit.
la source
Pour la question 1):
Étant donné que le message d'erreur ne semble pas indiquer quelle ligne de votre code est à l'origine du problème, vous pouvez le localiser en utilisant des points d'arrêt. Les points d'arrêt interrompent l'exécution du programme lorsque le programme atteint des lignes de code spécifiques. En ajoutant des points d'arrêt aux emplacements critiques, vous pouvez déterminer quelle ligne de code provoque le plantage. Par exemple, si votre programme plante sur une ligne setContentView (), vous pouvez y placer un point d'arrêt. Lorsque le programme s'exécute, il se met en pause avant d'exécuter cette ligne. Si la reprise provoque le blocage du programme avant d'atteindre le point d'arrêt suivant, vous savez alors que la ligne qui a tué le programme se trouvait entre les deux points d'arrêt.
L'ajout de points d'arrêt est facile si vous utilisez Eclipse. Faites un clic droit dans la marge juste à gauche de votre code et sélectionnez "Toggle breakpoint". Vous devez ensuite exécuter votre application en mode débogage, le bouton qui ressemble à un insecte vert à côté du bouton d'exécution normal. Lorsque le programme atteint un point d'arrêt, Eclipse passe à la perspective de débogage et vous montre la ligne à laquelle il attend. Pour redémarrer le programme, recherchez le bouton «Reprendre», qui ressemble à un «Lecture» normal mais avec une barre verticale à gauche du triangle.
Vous pouvez également remplir votre application avec Log.d ("Mon application", "Quelques informations ici qui vous indiquent où se trouve la ligne du journal"), qui publie ensuite des messages dans la fenêtre LogCat d'Eclipse. Si vous ne trouvez pas cette fenêtre, ouvrez-la avec Fenêtre -> Afficher la vue -> Autre ... -> Android -> LogCat.
J'espère que cela pourra aider!
la source
J'ai ajouté ce qui suit au manifeste de cette activité
la source
selon le code du windowManager (lien ici ), cela se produit lorsque la vue que vous essayez de mettre à jour (qui appartient probablement à une boîte de dialogue, mais pas nécessaire) n'est plus attachée à la racine réelle des fenêtres.
comme d'autres l'ont suggéré, vous devez vérifier l'état de l'activité avant d'effectuer des opérations spéciales sur vos boîtes de dialogue.
voici le code correspondant, qui est la cause du problème (copié à partir du code source Android):
la source
Mon problème a été résolu en bloquant la rotation de l'écran sur mon Android, l'application qui me causait un problème fonctionne maintenant parfaitement
la source
Une autre option consiste à ne pas démarrer la tâche asynchrone tant que la boîte de dialogue n'est pas attachée à la fenêtre en remplaçant onAttachedToWindow () dans la boîte de dialogue, de cette façon, elle est toujours rejetable.
la source
Ou simplement vous pouvez ajouter
ce qui rendra le
ProgressDialog
non annulablela source
Pourquoi ne pas essayer catch, comme ceci:
la source
lorsque vous déclarez une activité dans le manifeste, vous avez besoin d'android: configChanges = "orientation"
exemple:
la source