Android: IllegalStateException - Quand est-il jeté?
Dans ma demande, parfois, l'exception suivante est générée:
07-28 14:49:25.398: ERROR/AndroidRuntime(8097):
java.lang.IllegalStateException: The content of the adapter has changed
but ListView did not receive a notification. Make sure the content of
your adapter is not modified from a background thread, but only from the
UI thread. [in ListView(2131099717, class android.widget.ListView) with
Adapter(class ch.uzh.csg.games4blue.gamebase.view.UserView$UserAdapter)]
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.widget.ListView.layoutChildren(ListView.java:1432)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.widget.AbsListView.onLayout(AbsListView.java:1113)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.view.View.layout(View.java:6831)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.widget.LinearLayout.layoutVertical(LinearLayout.java:998)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.widget.LinearLayout.onLayout(LinearLayout.java:918)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.view.View.layout(View.java:6831)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.widget.LinearLayout.layoutHorizontal(LinearLayout.java:1108)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.widget.LinearLayout.onLayout(LinearLayout.java:920)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.view.View.layout(View.java:6831)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.widget.FrameLayout.onLayout(FrameLayout.java:333)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.view.View.layout(View.java:6831)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.widget.LinearLayout.layoutVertical(LinearLayout.java:998)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.widget.LinearLayout.onLayout(LinearLayout.java:918)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.view.View.layout(View.java:6831)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.widget.LinearLayout.layoutVertical(LinearLayout.java:998)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.widget.LinearLayout.onLayout(LinearLayout.java:918)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.view.View.layout(View.java:6831)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.widget.FrameLayout.onLayout(FrameLayout.java:333)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.view.View.layout(View.java:6831)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.widget.FrameLayout.onLayout(FrameLayout.java:333)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.view.View.layout(View.java:6831)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.view.ViewRoot.performTraversals(ViewRoot.java:996)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.view.ViewRoot.handleMessage(ViewRoot.java:1633)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.os.Handler.dispatchMessage(Handler.java:99)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.os.Looper.loop(Looper.java:123)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
android.app.ActivityThread.main(ActivityThread.java:4338)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
java.lang.reflect.Method.invokeNative(Native Method)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
java.lang.reflect.Method.invoke(Method.java:521)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
07-28 14:49:25.398: ERROR/AndroidRuntime(8097): at
dalvik.system.NativeStart.main(Native Method)
Il est difficile de trouver l'erreur, parce que dans le stacktrace aucun de mes méthodes est répertorié. Donc, personne ne sait quand cette exception est levée? Merci pour tous les conseils.
InformationsquelleAutor | 2010-07-28
Vous devez vous connecter pour publier un commentaire.
Vous pouvez voir l'erreur dans votre stacktrace :
Vous devriez regarder dans un de votre fil et de le rendre synchronisé avec votre thread de l'INTERFACE utilisateur.
Le moyen de le faire dans Android est avec le Gestionnaire.
http://developer.android.com/guide/appendix/faq/commontasks.html#threading
Il ne vous dire la classe de l'erreur se produit dans:
ch.uzh.csg.games4blue.gamebase.view.UserView
contient une classe appeléeUserAdapter
à l'intérieur.Laissez-moi vous expliquer ce qui se passe ici - Lorsque vous créez un
ListView
avec unAdapter
de la sauvegarder, laListView
obtient ses données en demandant à l'adaptateur pour elle. Chaque fois que vous faites défiler, la liste est de demander la Carte pour les nouveaux éléments que vous défiler dans.Normalement, vous créer la liste, vous créez la Carte, vous fixez l'adaptateur sur la liste, et vous avez terminé. Système d'exploitation Android prend en charge le reste. Ce que vous tentez de le faire, cependant, est un peu plus compliqué. Vous essayez de temps en temps de mettre à jour les données dans la carte. Vous pouvez imaginer que la liste aurait besoin d'être informé si la carte de données a changé, non? Si vous affichez une liste avec les 2 éléments, et vous avez soudain ajouter 2 éléments de la carte, la liste devrait être maintenant l'affichage des 4 éléments! Cependant, il serait très inefficace si la liste devait être continuellement de la vérification pour voir si la carte a changé, non? Donc, ce qui doit arriver, c'est le contrôle listview supposer que la carte ne change pas, et la carte en informera le listview en cas de modification. (Cet accord entre la liste et la carte permet à d'autres avantages, tels que la liste peut mettre en cache certains éléments extraits de la carte pour un accès rapide. Aka si il y a 10 liste des éléments affichés sur l'écran, la liste peut-être en fait déjà demandé de 14 éléments. De cette façon, si vous faites défiler vers le haut ou vers le bas, pour au moins 2 des éléments dans les deux sens de la liste dispose déjà des données à afficher!)
Ce que vous avez omis de le faire, cependant, c'est d'informer la listview que les données à l'intérieur de la carte a changé. Quelque part à l'intérieur de UserAdapter ou UserView les données en cours de modification! Pour rendre cela facile pour tout le monde, pourriez-vous publier UserView classe? Mon pari est que vous avez des données d'un objet, tel qu'une liste de tableaux, comme une variable privée à l'intérieur de la UserView classe. À l'intérieur de la UserAdapter classe vous êtes à la fourniture de ces données à la ListView. Cependant, quelque part à l'intérieur de la UserView classe vous êtes à la modification de cet ensemble de données, après que vous avez déjà fournies à la liste.
Disclaimer: je suis la plupart du temps la copie d'autres réponses ici, mais je pense que je peux offrir une plus claire vision de ce qui se passe si je combine les 2-3 réponses
Avertissement 2: je suis fatigué, et cela semble mal écrit. Faire un wiki dans l'espoir que quelqu'un nettoie mes fin de la nuit mess. Si c'est totalement inintelligible viens de le dire et de mauvais supprimer
Où vous utilisez
ch.uzh.csg.games4blue.gamebase.view.UserView$UserAdapter
.En effet, ce type d'erreur est envoyé lorsque vous modifiez le contenu de votre carte, sans le signaler à votre listview ou tout autre point de vue à l'aide d'un adaptateur que son contenu doit être mis à jour.
Essayez d'appeler
.notifyDataSetChanged()
sur la carte.J'ai le même problème que vous avez rencontrés, j'ai été en utilisant asynchrousTask pour remplir données dans la liste.J'ai résolu par une réécriture de code que les mises à jour de l'Interface utilisateur dans fn
Parce que ces fonction s'exécute dans le thread de l'INTERFACE utilisateur.
Espère que cette aide.
Je viens de corrigé cela!
Auparavant, je faisais le traitement lourd comme ça, où
list
était statique et en regard de l'Activité de la classe:J'ai ensuite fait une nouvelle liste, et de l'ajouter dans: