Что я хочу сделать : запустить фоновый поток, который вычисляет содержимое ListView и частично обновить ListView, пока рассчитываются результаты.
Чего я знаю, что мне следует избегать : я не могу связываться с содержимым ListAdapter из фонового потока, поэтому я унаследовал AsyncTask и опубликовал результат (добавление записей в адаптер) из onProgressUpdate.Мой адаптер использует ArrayList объектов результатов, все операции над этими массивами синхронизированы.
Исследования других людей : здесь есть очень ценные данные здесь .Я также страдал от почти ежедневных сбоев для группы из ~ 500 пользователей, и когда я добавил блок list.setVisibility(GONE)/trackList.setVisibility(VISIBLE)
в onProgressUpdate, сбои уменьшились в 10 раз, но не исчезли.(это было предложено в ответ )
То, что я иногда получал : пожалуйста, обратите внимание, что это происходит очень редко (один раз в неделю для одного из пользователей 3.5k).Но я бы хотел полностью избавиться от этой ошибки.Вот частичная трассировка стека:
`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 вставок, чтобы избежать мерцания и внезапных изменений списка.Это не может быть сделано таким образом, всегда уведомляйте адаптер при изменении базового списка.Эта ошибка давно исчезла для меня.