Lo que quiero hacer : ejecutar un subproceso en segundo plano que calcule el contenido de ListView y actualice ListView parcialmente, mientras se calculan los resultados.
Lo que sé que debo evitar : no puedo meterme con el contenido de ListAdapter del subproceso en segundo plano, así que heredé AsyncTask y publiqué el resultado (agregue entradas al adaptador) de onProgressUpdate. Mi adaptador usa ArrayList de objetos de resultado, todas las operaciones en esas listas de matriz están sincronizadas.
La investigación de otras personas : no hay datos muy valiosos aquí . También sufrí bloqueos casi diarios para un grupo de ~ 500 usuarios, y cuando agregué el list.setVisibility(GONE)/trackList.setVisibility(VISIBLE)
bloqueo en onProgressUpdate, los bloqueos disminuyeron en un factor de 10 pero no desaparecieron. (se sugirió en respuesta )
Lo que recibí a veces : tenga en cuenta que ocurre muy raramente (una vez a la semana para uno de los 3.5k usuarios). Pero me gustaría deshacerme de este error por completo. Aquí hay un seguimiento parcial de la pila:
`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)
[...]
¿Ayuda? Ya no es necesario, ver abajo
RESPUESTA FINAL: Resultó que estaba llamando notifyDataSetChanged
cada 5 inserciones para evitar parpadeos y cambios repentinos en la lista. No se puede hacer de esa manera, siempre notifique al adaptador cuando cambie la lista base. Este error ya hace mucho que me desapareció.