Yang ingin saya lakukan : menjalankan utas latar belakang yang menghitung konten ListView dan memperbarui ListView sebagian, sementara hasilnya dihitung.
Yang saya tahu harus saya hindari : Saya tidak bisa main-main dengan konten ListAdapter dari utas latar belakang, jadi saya mewarisi AsyncTask dan menerbitkan hasil (menambahkan entri ke adaptor) dari onProgressUpdate. Adaptor saya menggunakan ArrayList objek hasil, semua operasi pada daftar array disinkronkan.
Penelitian orang lain : ada data yang sangat berharga di sini . Saya juga menderita crash hampir setiap hari untuk sekelompok ~ 500 pengguna, dan ketika saya menambahkan list.setVisibility(GONE)/trackList.setVisibility(VISIBLE)
blok di onProgressUpdate, crash diturunkan dengan faktor 10 tetapi tidak hilang. (disarankan dalam jawaban )
Apa yang saya dapatkan kadang-kadang : tolong perhatikan, itu terjadi sangat jarang (seminggu sekali untuk salah satu dari pengguna 3.5k). Tapi saya ingin menyingkirkan bug ini sepenuhnya. Ini adalah stacktrace parsial:
`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)
[...]
Tolong? Tidak diperlukan lagi, lihat di bawah
JAWABAN FINAL: Ternyata, saya menelepon notifyDataSetChanged
setiap 5 insersi untuk menghindari perubahan daftar yang tiba-tiba berkedip. Itu tidak bisa dilakukan dengan cara seperti itu, selalu beri tahu adaptor ketika daftar dasar berubah. Bug ini sudah lama hilang untuk saya sekarang.