Was ich tun möchte : Führen Sie einen Hintergrund-Thread aus, der den ListView-Inhalt berechnet und ListView teilweise aktualisiert, während die Ergebnisse berechnet werden.
Was ich weiß, muss ich vermeiden : Ich kann mich nicht mit ListAdapter-Inhalten aus dem Hintergrund-Thread anlegen, daher habe ich AsyncTask geerbt und das Ergebnis (Einträge zum Adapter hinzufügen) von onProgressUpdate veröffentlicht. Mein Adapter verwendet ArrayList von Ergebnisobjekten. Alle Vorgänge auf diesen Arraylisten werden synchronisiert.
Forschung anderer Leute : Es gibt sehr wertvolle Daten hier . Ich litt auch unter fast täglichen Abstürzen für eine Gruppe von ~ 500 Benutzern, und als ich list.setVisibility(GONE)/trackList.setVisibility(VISIBLE)
Block in onProgressUpdate hinzufügte , verringerten sich die Abstürze um den Faktor 10, verschwanden aber nicht. (es wurde als Antwort vorgeschlagen )
Was ich manchmal bekam : Bitte beachten Sie, dass es sehr selten vorkommt (einmal pro Woche für einen von 3.5k Benutzern). Aber ich möchte diesen Fehler vollständig beseitigen. Hier ist eine teilweise Stapelverfolgung:
`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(2131296334, class android.widget.ListView) with Adapter(class com.transportoid.Tracks.TrackListAdapter)]
at android.widget.ListView.layoutChildren(ListView.java:1432)
at android.widget.AbsListView.onTouchEvent(AbsListView.java:2062)
at android.widget.ListView.onTouchEvent(ListView.java:3234)
at android.view.View.dispatchTouchEvent(View.java:3709)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:852)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
[...]
Hilfe? Wird nicht mehr benötigt, siehe unten
ENDGÜLTIGE ANTWORT: Wie sich herausstellte, habe ich notifyDataSetChanged
alle 5 Einfügungen aufgerufen, um ein Flackern und plötzliche Listenänderungen zu vermeiden. Dies ist nicht möglich. Benachrichtigen Sie den Adapter immer, wenn sich die Basisliste ändert. Dieser Fehler ist für mich jetzt schon lange vorbei.