Що я хочу зробити : запустити фонову нитку, яка обчислює вміст ListView та частково оновити ListView, тоді як результати обчислюються.
Чого я знаю, я мушу уникати : я не можу возитися зі змістом ListAdapter з фонової нитки, тому я успадкував AsyncTask і опублікував результат (додайте записи до адаптера) від onProgressUpdate. Мій адаптер використовує ArrayList об'єктів результатів, всі операції над цими масивами синхронізовані.
Дослідження інших людей : є дуже цінні дані тут . Я також зазнав майже щоденних збоїв для групи з ~ 500 користувачів, і коли я додав list.setVisibility(GONE)/trackList.setVisibility(VISIBLE)
блок в onProgressUpdate, збої знижуються в 10 разів, але не зникають. (було запропоновано у відповідь )
Що мені трапляється іноді : зверніть увагу, це трапляється дуже рідко (раз на тиждень для одного з 3,5 тис. Користувачів). Але я хотів би позбутися цієї помилки повністю. Ось частковий стек-трек:
`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)
[...]
Допомога? Більше не потрібно, дивіться нижче
ЗАКЛЮЧНИЙ ВІДПОВІДЬ: Як виявилося, я телефонував notifyDataSetChanged
кожні 5 вставок, щоб уникнути мерехтіння та раптових змін у списку. Це неможливо зробити так, завжди повідомляйте адаптер про зміну базового списку. Зараз ця помилка давно пішла для мене.