मैं क्या करना चाहता हूं : एक पृष्ठभूमि थ्रेड चलाएं जो सूची दृश्य सामग्री की गणना करता है और सूची दृश्य को आंशिक रूप से अपडेट करता है, जबकि परिणाम की गणना की जाती है।
मुझे पता है कि मुझे बचना है : मैं पृष्ठभूमि थ्रेड से ListAdapter सामग्री के साथ गड़बड़ नहीं कर सकता, इसलिए मुझे AsProTask विरासत में मिला और onProgressUpdate से परिणाम (एडॉप्टर में प्रविष्टियां जोड़ें) प्रकाशित किया। मेरे एडॉप्टर परिणाम वस्तुओं के ArrayList का उपयोग करता है, उन सरणीविस्ट पर सभी ऑपरेशन सिंक्रनाइज़ हैं।
अन्य लोगों का शोध : यहां बहुत मूल्यवान डेटा है । मुझे ~ 500 उपयोगकर्ताओं के समूह के लिए लगभग दैनिक दुर्घटनाओं का सामना करना पड़ा, और जब मैंने list.setVisibility(GONE)/trackList.setVisibility(VISIBLE)
onProgressUpdate में ब्लॉक जोड़ा , तो क्रैश 10 के एक कारक से कम हो गया लेकिन गायब नहीं हुआ। (यह जवाब में सुझाव दिया गया था )
मुझे कभी-कभी मिला : कृपया ध्यान दें, यह वास्तव में शायद ही कभी होता है (3.5k उपयोगकर्ताओं में से एक के लिए सप्ताह में एक बार)। लेकिन मैं इस बग से पूरी तरह छुटकारा पाना चाहूंगा। यहाँ आंशिक स्टैकट्रेस है:
`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 सम्मिलन को बुला रहा था । यह इस तरह से नहीं किया जा सकता है, हमेशा आधार सूची में परिवर्तन होने पर एडेप्टर को सूचित करें। यह बग अब लंबे समय तक मेरे लिए चला गया।