मैं एक एडलेप्टर में एक अंतर्निहित सूची अद्यतन करने वाला एक IllegalStateException में चल रहा हूं (एक ऐरेएडाप्टर या बेसएडाप्टर का विस्तार हो सकता है, मुझे याद नहीं है)। मेरे पास इस समय अपवाद के पाठ को याद या याद नहीं है, लेकिन यह एडाप्टर को परिवर्तन के अधिसूचित किए बिना सूची की सामग्री के प्रभाव के प्रभाव में कुछ कहता है।एडाप्टर के अंतर्निहित डेटा को अपडेट करने का सबसे अच्छा तरीका क्या है?
यह सूची/UI थ्रेड (मुख्य) के अलावा किसी अन्य थ्रेड से अपडेट की जा सकती है। इस सूची को अपडेट करने के बाद (एक आइटम जोड़ना), मैं अधिसूचना कॉल करता हूंडेटासेट चेंज। समस्या यह प्रतीत होती है कि एडाप्टर से जुड़ा एडाप्टर, या ListView इस विधि को लागू करने से पहले खुद को अपडेट करने का प्रयास करता है। जब ऐसा होता है, तो IllegalStateException फेंक दिया जाता है।
यदि मैं अद्यतन से पहले सूची देखने के लिए सूची दृश्य दृश्यता सेट करता हूं, तो फिर से विज़िबल करें, कोई त्रुटि नहीं होती है। लेकिन यह हमेशा व्यावहारिक नहीं है।
मैंने कहीं पढ़ा है कि आप इसे किसी अन्य धागे से अंतर्निहित संशोधित नहीं कर सकते हैं - यह एक विशेष एमवीसी पैटर्न को सीमित करने के लिए प्रतीत होता है, जैसा कि इस विशेष सूची के साथ, मैं विभिन्न धागे से आइटम जोड़ना चाहता हूं। मैंने माना कि जब तक मैंने अधिसूचित किया हैडेटाट चेंज() मैं सुरक्षित रहूंगा - कि एडाप्टर ने अंतर्निहित सूची पर फिर से विचार नहीं किया जब तक कि इस विधि को लागू नहीं किया गया था लेकिन ऐसा लगता है कि यह मामला नहीं है।
मुझे लगता है कि मैं जो पूछ रहा हूं वह है, क्या यूआई के अलावा अन्य धागे से अंतर्निहित सूची को अपडेट करना सुरक्षित हो सकता है? इसके अतिरिक्त, अगर मैं एडाप्टर के भीतर डेटा को संशोधित करना चाहता हूं, तो क्या मैं अंतर्निहित सूची या एडाप्टर को संशोधित करता हूं (इसके ऐड(), आदि विधियों के माध्यम से)। एडाप्टर के माध्यम से डेटा को संशोधित करना गलत लगता है।
मैं किसी अन्य साइट पर एक थ्रेड में आया जो मेरे लिए एक जैसी समस्या है: http://osdir.com/ml/Android-Developers/2010-04/msg01199.html (यह वह जगह है जहां से मैंने दृश्यता को पकड़ लिया। और एक दृश्य विचार)।
आपको मेरी विशेष समस्या का बेहतर विचार देने के लिए, मैं कुछ बताऊंगा कि मेरी सूची, एडाप्टर इत्यादि कैसे स्थापित की गई हैं।
मेरे पास क्यू नामक एक ऑब्जेक्ट है जिसमें एक लिंक्डलिस्ट है। कतार पर्यवेक्षण का विस्तार करती है, और जब चीजों को अपनी विधियों के माध्यम से अपनी आंतरिक सूची में जोड़ा जाता है, तो मैं setChanged() और अधिसूचनासूची() को कॉल करता हूं। इस कतार वस्तु में किसी भी धागे से आइटम जोड़े या हटाए जा सकते हैं।
मेरे पास एक "कतार दृश्य" गतिविधि है जिसमें एडाप्टर शामिल है। यह गतिविधि, इसकी ऑनक्रेट() विधि में, मेरे कतार वस्तु में पर्यवेक्षक श्रोता को पंजीकृत करती है। ऑब्जर्वर के अपडेट() विधि में मैं एडाप्टर परडेटाडेटांग() को सूचित करता हूं।
मैंने बहुत सारे लॉग आउटपुट को जोड़ा और यह निर्धारित किया कि जब यह IllegalStateExcption तब होता है जब मेरा ऑब्जर्वर कॉलबैक कभी नहीं लगाया जाता था। तो ऐसा लगता है कि एडाप्टर ने ऑब्जर्वर को अपने पर्यवेक्षकों को सूचित करने का मौका देने से पहले सूची के परिवर्तन को देखा, और एडाप्टर को सूचित करने के लिए मेरी विधि को कॉल किया कि सामग्री बदल गई है।
तो मुझे लगता है कि मैं जो पूछ रहा हूं वह है, क्या यह एडाप्टर को रिग-अप करने का एक अच्छा तरीका है? क्या यह एक समस्या है क्योंकि मैं यूआई थ्रेड के अलावा किसी थ्रेड से एडाप्टर की सामग्री अपडेट कर रहा हूं? यदि ऐसा है, तो मेरे पास एक समाधान हो सकता है (क्यूई ऑब्जेक्ट को यूआई थ्रेड में हैंडलर को बनाए जाने पर, और उस हैंडलर का उपयोग करके सभी सूची संशोधनों को दें, लेकिन यह अनुचित लगता है)।
मुझे एहसास है कि यह एक बहुत ही खुली पोस्ट है, लेकिन मैं इस पर थोड़ा सा खो गया हूं और मैंने जो लिखा है उस पर किसी भी टिप्पणी की सराहना करता हूं।
आपकी टिप्पणियों के लिए धन्यवाद, लेकिन अगर आप आगे की मदद नहीं करेंगे तो मैं कुछ चीजों पर उलझन में हूं। "कतार" ऑब्जेक्ट नाम एक गलत नामक है - यह वीडियो चलाने के लिए मीडिया की कतार है, या खेलने के लिए गाने है। यह एक मौजूदा इंडेक्स int के साथ आइटम की एक सूची है। मैं एडाप्टर को अपने मॉडल (मेरी सूची) के बीच सिर्फ एक पुल होने और देखने (ListView) के रूप में समझ गया। क्या होगा यदि मुझे उस डेटा को अपडेट करने की आवश्यकता है जो दृश्य किसी अन्य गतिविधि से प्रदर्शित होता है जहां मेरे पास एडाप्टर तक पहुंच नहीं है? अंतर्निहित सूची को अद्यतन करना स्वाभाविक प्रतीत होता है, शायद एक रननेबल से यदि यह कार्य करने वाला कार्य ब्लॉक हो सकता है। – skyler
"मैं एडाप्टर को अपने मॉडल (मेरी सूची) के बीच सिर्फ एक पुल होने और समझने (सूची दृश्य) के रूप में समझ गया।" यह आम तौर पर सच है। "क्या होगा यदि मुझे उस डेटा को अपडेट करने की आवश्यकता है जो दृश्य किसी अन्य गतिविधि से प्रदर्शित होता है जहां मेरे पास एडाप्टर तक पहुंच नहीं है?" सबसे अधिक संभावना है कि, आपके पास सूची तक पहुंच नहीं है, इसलिए, आपको एक और विस्तृत रणनीति की आवश्यकता होगी। "अंतर्निहित सूची को अपडेट करना स्वाभाविक प्रतीत होता है, शायद एक रननेबल से यदि यह कार्य करने वाला कार्य ब्लॉक हो सकता है।" आईएमएचओ, थ्रेडिंग इश्यू एक यूआई मुद्दा है, यही कारण है कि मैं अनुशंसा करता हूं कि आपका एडाप्टर थ्रेड सुरक्षा से निपटने के लिए एक हो। – CommonsWare
लेकिन, आप इसे लागू करने के लिए स्वागत करते हैं, हालांकि आप चाहते हैं, जब तक आप केवल मुख्य एप्लिकेशन थ्रेड पर एडाप्टर अपडेट करें। – CommonsWare