Co chcę zrobić : uruchomić wątek w tle, który oblicza zawartość ListView i częściowo aktualizować ListView, a wyniki są obliczane.
Wiem, czego muszę unikać : nie mogę zadzierać z zawartością ListAdapter z wątku w tle, więc odziedziczyłem AsyncTask i opublikowałem wynik (dodaj wpisy do adaptera) z onProgressUpdate. Mój adapter używa ArrayList obiektów wynikowych, wszystkie operacje na tych tablicach arraylistów są zsynchronizowane.
Badania z innymi ludźmi : jest bardzo cenne dane tutaj . Cierpiałem także na prawie codzienne awarie dla grupy ~ 500 użytkowników, a kiedy dodałem list.setVisibility(GONE)/trackList.setVisibility(VISIBLE)
blok w onProgressUpdate, awarie zostały zmniejszone 10-krotnie, ale nie zniknęły. (zasugerowano w odpowiedzi )
Co czasami dostaję : zauważ, że zdarza się to bardzo rzadko (raz w tygodniu dla jednego z 3,5 tys. Użytkowników). Ale chciałbym całkowicie pozbyć się tego błędu. Oto częściowe śledzenie stosu:
`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)
[...]
Wsparcie? Już nie potrzebne, patrz poniżej
OSTATECZNA ODPOWIEDŹ: Jak się okazało, dzwoniłem notifyDataSetChanged
co 5 wstawek, aby uniknąć migotania i nagłych zmian listy. Nie można tego zrobić w ten sposób, zawsze powiadamiaj adapter o zmianie listy podstawowej. Ten błąd już dawno dla mnie minął.