Cosa voglio fare : eseguire un thread in background che calcola i contenuti di ListView e aggiorni parzialmente ListView, mentre i risultati vengono calcolati.
Quello che so devo evitare : non posso scherzare con i contenuti di ListAdapter dal thread in background, quindi ho ereditato AsyncTask e ho pubblicato i risultati (aggiungi voci all'adattatore) da onProgressUpdate. Il mio adattatore utilizza ArrayList di oggetti risultato, tutte le operazioni su tali array sono sincronizzate.
La ricerca di altre persone : non è molto prezioso dati qui . Ho anche sofferto di crash quasi giornalieri per un gruppo di ~ 500 utenti e quando ho aggiunto il list.setVisibility(GONE)/trackList.setVisibility(VISIBLE)
blocco su onProgressUpdate, gli arresti anomali si sono ridotti di un fattore 10 ma non sono scomparsi. (è stato suggerito in risposta )
Quello che ho ricevuto a volte : si prega di notare che succede molto raramente (una volta alla settimana per uno degli utenti da 3,5k). Ma vorrei liberarmi completamente di questo errore. Ecco stack stack parziale:
`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)
[...]
Aiuto? Non più necessario, vedi sotto
RISPOSTA FINALE: Come ho scoperto, stavo chiamando notifyDataSetChanged
ogni 5 inserzioni per evitare sfarfallio e improvvisi cambi di lista. Non può essere fatto in questo modo, avvisare sempre l'adattatore quando cambia l'elenco di base. Questo bug è ormai scomparso da tempo.