मैं इस सवाल यहाँ बना लिया है: कॉलिंग Activity.stopManagingCursor() एडाप्टर के कर्सर पर कर्सर को बदलने से पहले समस्या हल हो। मैंने सोचा कि इस पर एक नया धागा खोलने से केवल जटिल चीजें ही होंगी।
मैं जब मैं गतिविधि एकको गतिविधि बी से जाना और फिर वापस गतिविधि एक के लिए जा रहा अनुप्रयोग क्रैश मिलता है। यह हर समय नहीं होता है - केवल कभी-कभी और मुझे यह पता चलने में मुश्किल होती है कि यह कहां होता है। सभी एक ही डिवाइस (नेक्सस एस) पर होते हैं लेकिन मुझे विश्वास नहीं है कि यह एक डिवाइस मुद्दा है।
मेरे पास @ मार्टिन स्टाइन के उत्तर के बारे में कुछ प्रश्न हैं।
- प्रलेखन में यह
changeCursor(c);
के बारे में कहते हैं: "एक नया कर्सर करने के लिए अंतर्निहित कर्सर बदले कोई मौजूदा कर्सर यह बंद कर दिया जाएगा है।"। तो मुझे stopManagingCursor(currentCursor);
- क्यों अनावश्यक नहीं है?
- जब मैं @ मार्टिन स्टाइन द्वारा प्रदान किए गए कोड का उपयोग करता हूं तो मुझे एक शून्य सूचक अपवाद मिलता है। इसका कारण यह है कि आवेदन
((SimpleCursorAdapter)getListAdapter())
के पहले "रन" में एनयूएलएल का मूल्यांकन होगा क्योंकि कोई कर्सर अभी तक नहीं बनाया गया था।निश्चित रूप से मैं जांच सकता हूं कि मुझे शून्य नहीं मिल रहा है और केवल कर्सर को प्रबंधित करने के लिए रोकने का प्रयास करें, लेकिन आखिरकार मैंने अपना 'स्टॉप मैनेजिंग कर्सर (वर्तमान कर्सर) रखने का फैसला किया; इस गतिविधि के onPause() विधि में। मैंने सोचा कि इस तरह से मैं निश्चित रूप से एक कर्सर को प्रबंधन बंद करना होगा और मुझे गतिविधि को अलग-अलग छोड़ने से पहले इसे करना चाहिए। मुद्दा - मैं अपनी गतिविधि में कई कर्सर (एक संपादन टेक्स्ट फ़ील्ड का एक पाठ भरने के लिए और दूसरा एक सूची दृश्य के लिए) का उपयोग कर रहा हूं, मुझे लगता है कि उनमें से सभी एक सूची एडाप्टर कर्सर से संबंधित नहीं हैं -
- मैं कैसे करूँ? पता है कि किसको प्रबंधन करना बंद करना है? अगर मेरे पास 3 अलग-अलग सूची दृश्य हैं?
- क्या मुझे
onPause()
के दौरान उन सभी को बंद करना चाहिए?
- मैं अपने सभी खुले कर्सर की सूची कैसे प्राप्त करूं?
तो कई सवाल ... आशा किसी को भी मदद कर सकता है।
जब मैं onPause()
पर जाता हूं तो मेरे पास प्रबंधन रोकने के लिए एक कर्सर होता है लेकिन मुझे यह निर्धारित करने के लिए अभी भी पता नहीं है कि यह समस्या हल करती है क्योंकि यह त्रुटि स्पोरैडिक रूप से दिखाई देती है।
बहुत धन्यवाद!
कुछ जांच के बाद:
मुझे लगता है कि इस मुद्दे का "रहस्यमय" पक्ष का जवाब दे सकता है कुछ रोचक लगा:
गतिविधि एक दो कर्सर का उपयोग करता है: एक एक EditText को भरने के लिए खेत। दूसरा एक सूची दृश्य को पॉप्युलेट करना है।
गतिविधि ए से गतिविधि बी में जाने और वापस आने पर, गतिविधि ए में फ़ील्ड + सूची दृश्य फिर से भरा जाना चाहिए। ऐसा लगता है कि एडिटटेक्स्ट फ़ील्ड को इसके साथ कोई समस्या नहीं होगी। मुझे एडिटटेक्स्ट फ़ील्ड के वर्तमान कर्सर (Cursor currentCursor = ((SimpleCursorAdapter)getListAdapter()).getCursor();
में) प्राप्त करने का कोई तरीका नहीं मिला, और कारण मुझे बताता है कि EditText फ़ील्ड इसे नहीं रखेगा। दूसरी तरफ ListView अपने कर्सर को आखिरी बार "गतिविधि ए -> गतिविधि बी से पहले" याद रखेगा। > गतिविधि एक और यह सब बिना मुझे कभी बुला
Cursor currentCursor = ((SimpleCursorAdapter)getListAdapter()).getCursor();
stopManagingCursor(currentCursor);
, जब सिस्टम की जरूरत है मैं कुछ मामलों में लगता है - इसके अलावा, और यह अजीब बात है, Cursor currentCursor = ((SimpleCursorAdapter)getListAdapter()).getCursor();
गतिविधि बी के बाद एक अलग आईडी होगा संसाधनों को मुक्त करने के लिए, कर्सर को मार दिया जाएगा और जब गतिविधि बी -> गतिविधि ए, सिस्टम अभी भी इस पुराने मृत कर्सर का उपयोग करने का प्रयास करेगा, जिसके परिणामस्वरूप अपवाद होगा। और अन्य मामलों में प्रणाली एक नए कर्सर के साथ आ जाएगी जो अभी भी जीवित है और इस प्रकार कोई अपवाद नहीं होगा। यह समझा सकता है कि यह कभी-कभी क्यों दिखाई देता है। मुझे लगता है कि या तो एप्लिकेशन की गति के अंतर के कारण डीबग करना मुश्किल है या तो एप्लिकेशन चला रहा है या डीबग करना है। डिबगिंग करते समय, इसमें अधिक समय लगता है और इस प्रकार सिस्टम को नए कर्सर या इसके विपरीत आने का समय मिल सकता है।
मेरी समझ में यह
Cursor currentCursor = ((SimpleCursorAdapter)currentListAdapter).getCursor();
stopManagingCursor(currentCursor);
के उपयोग में आता है @Martin स्टाइन एक चाहिए कुछ मामलों में और अनावश्यक दूसरों में की सिफारिश के रूप में: अगर मैं विधि में लौटने और प्रणाली कोशिश कर रहा है एक मृत कर्सर का उपयोग करने के लिए, किसी को एक नया कर्सर बनाना होगा और उसे सूची एडाप्टर में बदलना होगा, अन्यथा मुझे क्रैश ऐप वाले क्रैश ऐप उपयोगकर्ता मिलेंगे।एक और मामले में जब सिस्टम खुद को एक नया कर्सर मिलेगा - उपर्युक्त पंक्तियां अनावश्यक हैं क्योंकि वे एक अच्छे कर्सर को अमान्य करते हैं और एक नया बनाते हैं।
मैं इस अतिरेक को रोकने के लिए लगता है कि मैं कुछ इस तरह की आवश्यकता होगी:
ListAdapter currentListAdapter = getListAdapter();
Cursor currentCursor = null;
Cursor c = null;
//prevent Exception in case the ListAdapter doesn't exist yet
if(currentListAdapter != null)
{
currentCursor = ((SimpleCursorAdapter)currentListAdapter).getCursor();
//make sure cursor is really dead to prevent redundancy
if(currentCursor != null)
{
stopManagingCursor(currentCursor);
c = db.fetchItems(selectedDate);
((SimpleCursorAdapter)getListAdapter()).changeCursor(c);
}
else
{
c = db.fetchItems(selectedDate);
}
}
else
{
c = db.fetchItems(selectedDate);
}
startManagingCursor(c);
मैं सुनने के लिए आप इस बारे में क्या सोचते प्यार होता!
आप हनीकोम्ब लक्षित कर रहे हैं विशेष रूप से। बस पाया कि मेरा Eclair + ऐप हनीकॉम्ब में टूटा हुआ है, प्रारंभ करने की वजह से कर्सर()। मेरा ऐप फोन पर लक्षित है, लेकिन आइसक्रीम सैंडविच बाहर आने पर नाराज ग्राहकों की प्रतीक्षा नहीं कर रहा है। – Tenfour04
हां मैं विशेष रूप से हनीकॉम (टैबलेट) को लक्षित कर रहा हूं। –
@ साइबर-भिक्षु हाय - मुझे कोई समस्या है। मैं इसे लागू नहीं कर सकता क्योंकि मेरा कोड कर्सर लोडर को पहचाना नहीं जाएगा। मैंने इसे सही तरीके से आयात किया लेकिन यह आयात को भी पहचान नहीं पाया। मैं यह कैसे तय करुं? – Mxyk