Ich benutze AsyncTask, um meine Objekte und Sachen einzustellen, im postExecute rufe ich eine synchronisierte Methode auf, wo ich das tue
%Vor%Meistens funktioniert es, wenn ich neue Daten downloade und meinen Listenansicht / Adapter aktualisiere, und ziemlich gut. Aber irgendwie stürzt es irgendwann ab, kann mir jemand bei diesem Problem assistieren.
here mein Crash-Log.
%Vor%Ich sollte meine qetion mit meinem Code aktualisieren, also hier ist es.
%Vor%Der Grund für die Syncronized-Methode war nur, dass Sie versuchen, den Adapter und die Listview gleichzeitig zu aktualisieren.
Entsprechend dem Code-Snippet gibt es einige Methoden (bindResources () und bindListeners () und etc.), die als @Override gekennzeichnet sind und weder von der offiziellen API übernommen noch explizit in AllResultsActivity aufgerufen werden. Angenommen, diese sind korrekt implementiert und in der Superklasse oder an einem anderen Ort beteiligt. Das Problem, das ich in Ihrem Code sehe, ist:
%Vor%Das Problem ist, wenn AysncTask ausgeführt und onPostExecute () get aufgerufen wird (wo mAllResultsAdapter.notifyDataSetChanged (); get aufgerufen wird), der Adapter hat noch nicht an ListView gebunden. Einfach Aufruf initListview (); vor loadItems (apiKey); sollte die java.lang.IllegalStateException: weggehen.
Aktualisierung:
Ich habe einen tiefen Blick in Ihren Code geworfen, das Problem ist, dass die ArrayList, die an Adapter gebunden ist, im Hintergrund-Thread geändert wird:
Ihr Adapter wird tatsächlich von einem Hintergrund-Thread geändert, genau wie die Ausnahme vorgeschlagen. Die Lösung verschiebt sie in den UI-Thread oder wickelt sie einfach mit runOnUiThread ():
%Vor%Hoffe, das hilft.
Ich weiß, dass dieser Thread 3 Jahre alt ist. Ich wurde gebeten, ein zu beheben. Der Inhalt des Adapters wurde geändert, aber ListView hat in vorhandenem Code keinen Fehler angezeigt. Ich habe die Verwendungen von Timer
untersucht und ein runOnUiThread () hinzugefügt, aber das Problem zeigte sich immer noch. Aber alles wurde auf dem UI-Thread gemacht!
Tatsächlich zeigte das ListView
Daten basierend auf einem Dateisystemverzeichnis an - das entsprach der Anzeige aller Dateien in einem Verzeichnis in einem ListView
. Die Funktionen getCount()
und getView()
lesen Daten direkt aus dem Verzeichnis. Wenn Android feststellen konnte, dass sich die Anzahl der Dateien geändert hat, wurde eine Ausnahme ausgelöst.
Die Lösung bestand darin, die Verzeichnisliste zwischenzuspeichern und sie vom Zeitgeber aktualisieren zu lassen. Ja, die Änderungen auf der Festplatte konnten nicht sofort in der Ansicht wiedergegeben werden ... aber le mieux est l'ennemi du bien .