Android: ProgressDialog.show() bloque avec getcontexteapplication
Je n'arrive pas à comprendre pourquoi ce qui se passe. Ce code:
mProgressDialog = ProgressDialog.show(this, "", getString(R.string.loading), true);
fonctionne très bien. Toutefois, ce code:
mProgressDialog = ProgressDialog.show(getApplicationContext(), "", getString(R.string.loading), true);
jette l'exception suivante:
W/WindowManager( 569): Attempted to add window with non-application token WindowToken{438bee58 token=null}. Aborting.
D/AndroidRuntime( 2049): Shutting down VM
W/dalvikvm( 2049): threadid=3: thread exiting with uncaught exception (group=0x4001aa28)
E/AndroidRuntime( 2049): Uncaught handler: thread main exiting due to uncaught exception
E/AndroidRuntime( 2049): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tastekid.TasteKid/com.tastekid.TasteKid.YouTube}: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
E/AndroidRuntime( 2049): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2401)
E/AndroidRuntime( 2049): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
E/AndroidRuntime( 2049): at android.app.ActivityThread.access$2100(ActivityThread.java:116)
E/AndroidRuntime( 2049): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
E/AndroidRuntime( 2049): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 2049): at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 2049): at android.app.ActivityThread.main(ActivityThread.java:4203)
E/AndroidRuntime( 2049): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 2049): at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime( 2049): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
E/AndroidRuntime( 2049): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
E/AndroidRuntime( 2049): at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 2049): Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
E/AndroidRuntime( 2049): at android.view.ViewRoot.setView(ViewRoot.java:460)
E/AndroidRuntime( 2049): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
E/AndroidRuntime( 2049): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
E/AndroidRuntime( 2049): at android.app.Dialog.show(Dialog.java:238)
E/AndroidRuntime( 2049): at android.app.ProgressDialog.show(ProgressDialog.java:107)
E/AndroidRuntime( 2049): at android.app.ProgressDialog.show(ProgressDialog.java:90)
E/AndroidRuntime( 2049): at com.tastekid.TasteKid.YouTube.onCreate(YouTube.java:45)
E/AndroidRuntime( 2049): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
E/AndroidRuntime( 2049): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
E/AndroidRuntime( 2049): ... 11 more
Des idées pourquoi ce qui se passe? J'appelle cela de la onCreate
méthode.
- Si vous utilisez
Fragment
, stackoverflow.com/questions/24825114/...
Vous devez vous connecter pour publier un commentaire.
Qui version de l'API que vous utilisez? Si j'ai raison à propos de ce que le problème est ensuite cela a été corrigé dans Android 1.6 (de l'API de la version 4).
Il ressemble à l'objet de référence qui
getApplicationContext()
est de retour juste des points à null. Je pense que vous êtes confronté à un problème similaire à celui que j'avais en ce qu'une partie du code dans leonCreate()
est en cours d'exécution avant que la fenêtre est en fait fait en cours de construction. Cela va être un hack, mais essayez de lancer un nouveau Thread en quelques centaines de millisecondes (IIRC: 300-400 semblait fonctionner pour moi, mais vous aurez besoin de bricoler) qui ouvre votre ProgressDialog et commence autre chose que vous nécessaire (par exemple. réseau IO). Quelque chose comme ceci:Je suis en utilisant la version Android 2.1 avec l'API de Niveau 7. J'ai face à cette (ou similaire) problème et de le résoudre en utilisant ceci:
au lieu de cela:
Espère que cela aide 🙂
Pour moi travaillé en changeant
à
Bizarre, c'est que le premier peut être trouvé dans google tutoriel et aux gens d'avoir d'erreur sur ce..
this
tout seul ne fonctionnera pas si vous faites cela, l'intérieur a, par exemple, cliquez sur l'auditeur.Je ne pense pas que ce soit un problème de synchronisation autour d'un null contexte de l'application
Essayer d'étendre l'Application au sein de votre application (ou simplement l'utiliser si vous avez déjà)
Faire l'instance disponibles en tant que privé singleton. C'est jamais null
Apporter une assistance statique dans MyApp (qui utilisera le singleton)
BOOM!!
Aussi, découvrez android de l'ingénieur de la réponse ici: WindowManager$BadTokenException
Maintenant, je suis d'accord, il n'a pas de sens de dire que la méthode prend un Contexte param, au lieu de l'Activité..
Avoir lu les réponses ci-dessus, je trouve que pour ma situation fixes suivants de la question.
Ce jeté l'erreur
Basé sur les réponses précédentes suggérant que le contexte était le mauvais, j'ai changé le getcontexteapplication() pour récupérer le contexte de l'avis transmis à l'boutons onClick méthode.
Je ne comprends pas tout le fonctionnement de Java, donc j'ai peut-être tort, mais je devine que pour ma situation spécifique de la cause pourrait avoir été liée au fait que l'extrait ci-dessus a été défini dans un Résumé de l'Activité de la classe; héritées et utilisé par de nombreuses Activités, peut-être qui a contribué au fait que getcontexteapplication() ne retourne pas un contexte valide?? (Juste une supposition).
Je suis entrain de créer un plan avec vue détaillée des superpositions. J'étais en train de créer mon itemizedoverlay comme cela à partir de mon mapActivity:
J'ai trouvé que je voudrais obtenir le "android.vue.WindowManager$BadTokenException: Impossible d'ajouter de la fenêtre -- jeton null n'est pas une application de" l'exception " quand mon itemizedoverlay de onTap méthode a été déclenchée(lorsque l'emplacement est tapé sur la mapview).
J'ai trouvé que si j'ai simplement passé, " il "au lieu de" getcontexteapplication()' pour mon constructeur, le problème a disparu. Cela semble à l'appui de alienjazzcat de la conclusion. bizarre.
Pour les Activités indiquées dans TabActivities utilisation getParent()
au lieu de
Pour Android 2.2
Utilisez ce code:
au lieu de ce code:
Remarque: Mon dialogue personnalisé est créé à l'extérieur de
activity.onCreateDialog(int dialogId)
méthode.Essayez -
A eu un problème similaire avec (compatibilité) des Fragments dans lesquels l'aide d'un
getActivity()
dansProgressDialog.show()
plante, il. Je serai d'accord que c'est à cause de timing.Un éventuel correctif:
au lieu d'utiliser
Lieu le mContext dès que possible afin de lui donner plus de temps pour saisir le contexte. Il n'y a toujours pas de garantie que cela fonctionne, il réduit simplement la probabilité d'un crash. Si cela ne fonctionne toujours pas, vous devrez recourir à la minuterie de hack (qui peut causer d'autres problèmes de timing comme rejetant la boîte de dialogue plus tard).
Bien sûr, si vous pouvez utiliser
this
ouActivityName.this
, c'est plus stable, carthis
déjà les points à quelque chose. Mais dans certains cas, comme avec certains Fragment d'architectures, il n'est pas une option.(Pour référence)
Je pense que c'est parce qu'il y a des différences dans le Contexte de l'Application et du Contexte d'Activité, comme expliqué ici: http://www.doubleencore.com/2013/06/context/
Ce qui signifie que nous ne pouvons pas afficher la boîte de dialogue à l'aide de Contexte de l'Application. C'est tout.
Pour l'utilisation de boîtes de dialogue à l'intérieur des activités, faire de cette façon:
Pour l'utilisation de boîtes de dialogue à l'intérieur des fragments, faire de cette façon:
Que c'est tout ^_^
Ce que j'ai fait pour contourner ce problème est de créer une classe de base pour toutes mes activités où je stocke des données globales. Dans la première activité, j'ai enregistré le contexte d'une variable dans ma classe de base comme:
De La Classe De Base
Première Activité dérivée de la Classe de Base
Puis-je utiliser mycontext au lieu de getcontexteapplication lors de la création de boîtes de dialogue.
Si vous appelez ProgressDialog.show() dans un fragment, un moulage de la mContext à l'Activité a fonctionné pour moi.
J'ai implémenté boîte de Dialogue d'Alerte pour l'exception de jeter l'actuel activitty vue.Chaque fois que j'avais donné comme cette
Donné même Fenêtre Exception.J'écris du code d'alerte de onCreate().Tellement simple que j'ai utilisé
context = this;
aprèssetContentView()
déclaration dansonCreate()
méthode.Pris variable de contexte global commeContext context;
Exemple de Code est
Alerte Méthode de l'Échantillon est
Il fonctionne très bien pour moi.En fait j'ai cherché pour cette erreur sur StackOverflow, j'ai trouvé cette requête.Après la lecture de toutes les réponses de ce post, j'ai essayé de cette façon, de sorte qu'Il fonctionne .J'ai pensé que c'est une solution simple pour surmonter l'exception.
Grâce,
Rajendar
si vous avez un problème sur groupActivity ne pas utiliser ce.
Le PARENT est une statique à partir du Parent ActivityGroup.
au lieu de
Une boîte de dialogue est toujours créé et affiché comme une partie d'une Activité. Vous devez passer dans un contexte d'Activité au lieu de le contexte de l'Application.
http://developer.android.com/guide/topics/ui/dialogs.html#ShowingADialog
C'est un problème commun.
Utilisation
this
au lieu degetApplicationContext()
Cela devrait résoudre votre problème