2010-12-06 11 views
4

Je viens de publier ma première application Google Marketplace et a reçu l'information, que l'application est écrasé - je suis arrivé deux stacktraces, l'un d'entre eux par exemple:Android: deux erreurs parfois seulement/sur certains appareils

android.view.WindowManager$BadTokenException: Unable to add window -- token [email protected] is not valid; is your activity running? 
    at android.view.ViewRoot.setView(ViewRoot.java:468) 
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177) 
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
    at android.view.Window$LocalWindowManager.addView(Window.java:424) 
    at android.app.Dialog.show(Dialog.java:239) 
    at abc.de.f.MyTask.onPreExecute(MyTask.java:52) 

Il n'y a qu'une seule possibilité d'accéder à la méthode onPreExecute() dans MyTask - et ça ne plante pas dans l'émulateur ou sur mon périphérique physique. Mais il semble parfois s'écraser "dans la nature".

Quels seraient vos premiers pas pour arriver à la raison?

Merci beaucoup,

Stefan

EDIT:

@Override 
protected void onPreExecute() { 
    this.dialog.setMessage(((Activity) listener).getString(R.string.daten_werden_geladen)); 
    this.dialog.show(); 
} 

this.dialog.setMessage fonctionne, mais show() ne ... :(

Répondre

5

Looks comme si vous mettez à jour l'interface utilisateur ou affichez une boîte de dialogue à partir de onPreExecute() en utilisant le contexte d'une activité qui est fermée.Il y a une erreur logique dans l'implémentation de votre tâche. La ctivité s'exécute avant que vous mettiez à jour l'interface utilisateur en utilisant le contexte ou si vous détenez une référence à une vue de l'activité.

EDIT: Au lieu d'utiliser le contexte de l'activité pour obtenir l'utilisation de la ressource de chaîne, essayez d'utiliser le contexte de votre application.

this.dialog.setMessage(((Activity) listener).getApplicationContext().getString(R.string.daten_werden_geladen)); 
+0

Salut Varun, merci beaucoup pour votre réponse, je vais essayer. Mais avez-vous une idée de pourquoi ça ne semble que s'écraser parfois? Comme je suis triste, il n'y a qu'une seule possibilité d'y arriver; et il y a beaucoup de testeurs là-bas et ça fonctionne toujours; néanmoins j'ai eu le message d'erreur avec la trace de la pile ... – swalkner

+0

Si vous établissez une connexion http à partir de la tâche, et il est possible que parfois il faut plus de temps pour établir la connexion. De plus, si vous détenez une référence à un objet contextuel dans la tâche, vous pouvez essayer de le mettre à jour avec le contexte actuel. – Varun

+0

mais l'erreur se produit dans la méthode onPreExecute, la connexion HTTP est établie plus tard: dans doInBackground ... :( – swalkner

0

Il me semble que votre activité n'est pas encore en cours d'exécution (ou déjà disparu comme mentionné précédemment)

Il peut dépendre de la façon dont les fils exécutent et aussi le cycle de vie de l'application ne sont pas exactement même sur toutes les versions d'Android, j'essaierais de le reproduire dans les émulateurs avec 1.6, 2.1 & 2.2 au moins. En outre, le rapport de marché peut vous dire si cela se produit uniquement dans un appareil particulier.

Je ne serais pas surpris si un changement de fabricant a eu un impact sur la façon dont le cycle de vie de l'activité est effectué. J'essayerais de vérifier au moins sur l'appareil HTC Sense et peut-être sur certains LG, Samsung ou Motorola puisque tous ont des réglages de l'interface utilisateur sur Android. Une solution possible (mais ce n'est qu'un hack et ne pas résoudre le problème) est de retarder l'exécution de ce code en utilisant postDelayed, en faisant cela, vous êtes sûr qu'il va dans le thread UI après quelques ms. Comme je l'ai dit, cela n'attaquera pas la source du problème, mais cela pourrait le faire disparaître.

0

swalkner, il semble que vous devez prendre en charge les changements de configuration dans votre application .Vérifier this

0

nous ne pouvons pas utiliser getApplicationContext() pour obtenir le contexte, il faut utiliser l'activité pour obtenir Context.because seule activité peut ajouter vue