O que eu quero fazer : execute um thread em segundo plano que calcule o conteúdo do ListView e atualize o ListView parcialmente, enquanto os resultados são calculados.
O que sei que tenho que evitar : não posso mexer com o conteúdo do ListAdapter do encadeamento em segundo plano, portanto, herdei o AsyncTask e publiquei o resultado (adicione entradas ao adaptador) do onProgressUpdate. Meu adaptador usa ArrayList dos objetos de resultado, todas as operações nessas listas de matriz são sincronizadas.
Pesquisa de outras pessoas : há dados muito valiosos aqui . Também sofri falhas quase diárias para um grupo de ~ 500 usuários e, quando adicionei o list.setVisibility(GONE)/trackList.setVisibility(VISIBLE)
bloqueio no onProgressUpdate, falhas reduzidas em um fator de 10, mas não desapareceram. (foi sugerido em resposta )
O que recebi às vezes : observe que isso acontece muito raramente (uma vez por semana para um dos 3,5 mil usuários). Mas eu gostaria de me livrar desse bug completamente. Aqui está o stacktrace parcial:
`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)
[...]
Socorro? Não é mais necessário, veja abaixo
RESPOSTA FINAL: Como se viu, eu estava ligando a notifyDataSetChanged
cada 5 inserções para evitar oscilações e alterações repentinas da lista. Isso não pode ser feito dessa maneira, sempre notifique o adaptador quando a lista de base for alterada. Este bug há muito tempo para mim agora.