สิ่งที่ฉันต้องการทำ : เรียกใช้เธรดพื้นหลังซึ่งคำนวณเนื้อหา ListView และอัปเดต ListView บางส่วนในขณะที่คำนวณผลลัพธ์
สิ่งที่ฉันรู้ว่าฉันต้องหลีกเลี่ยง : ฉันไม่สามารถยุ่งกับเนื้อหา ListAdapter จากเธรดพื้นหลังดังนั้นฉันจึงสืบทอด AsyncTask และเผยแพร่ผลลัพธ์ (เพิ่มรายการไปยังอะแดปเตอร์) จาก onProgressUpdate อะแดปเตอร์ของฉันใช้ ArrayList ของวัตถุผลลัพธ์การดำเนินการทั้งหมดในรายการอาร์เรย์เหล่านั้นจะถูกซิงโครไนซ์
งานวิจัยของคนอื่น ๆ : มีข้อมูลที่มีคุณค่ามากที่นี่ ฉันยังได้รับความเดือดร้อนจากการล่มเกือบทุกวันสำหรับกลุ่มผู้ใช้ประมาณ 500 คนและเมื่อฉันเพิ่มlist.setVisibility(GONE)/trackList.setVisibility(VISIBLE)
block ใน onProgressUpdate การล่มก็ลดลงด้วยปัจจัย 10 แต่ไม่หายไป (แนะนำในคำตอบ )
สิ่งที่ฉันได้รับ : โปรดสังเกตว่ามันไม่ค่อยเกิดขึ้นจริง ๆ (สัปดาห์ละครั้งสำหรับผู้ใช้หนึ่งใน 3.5k) แต่ฉันต้องการกำจัดข้อผิดพลาดนี้อย่างสมบูรณ์ นี่คือ stacktrace บางส่วน:
`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 แทรกเพื่อหลีกเลี่ยงการกะพริบและการเปลี่ยนแปลงรายการอย่างฉับพลัน ไม่สามารถทำได้ด้วยวิธีนี้แจ้งให้อะแดปเตอร์เสมอเมื่อมีการเปลี่ยนแปลงรายการฐาน ข้อผิดพลาดนี้มันหายไปนานสำหรับฉันตอนนี้