2012-03-14 11 views
12

मेरी गतिविधि एसडी कार्ड पर सभी छवियों को प्राप्त करने के लिए इस कोड को शामिल असमर्थ:फिर से शुरू करने गतिविधि त्रुटि

String[] projection = {MediaStore.Images.Media._ID, 
         MediaStore.Images.Media.DATA, 
         MediaStore.Images.ImageColumns.DATA}; 
Cursor cursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
          projection, null, null, 
          MediaStore.Images.Media._ID); 
int count = cursor.getCount(); 
int image_path_index = cursor.getColumnIndex(MediaStore.Images.Media.DATA); 
int i; 
for(i = 0; i < count; i++) { 
    cursor.moveToPosition(i); 
    String p = cursor.getString(image_path_index); 
    fd.addToPhonePhoto(p); 
} 
cursor.close(); 

उस समय हुई जब गतिविधि शुरू करने गया था:

03-14 14:06: 48.380: ई/एंड्रॉइड रनटाइम (20793): java.lang.RuntimeException: गतिविधि को फिर से शुरू करने में असमर्थ {}: java.lang.RuntimeException: गतिविधि फिर से शुरू करने में असमर्थ {}: android.database.StaleDataException: कर्सर को एक्सेस करने के बाद इसे एक्सेस करने का प्रयास किया गया बन्द है।

यह केवल एंड्रॉइड 4.0 पर होता है। यदि एंड्रॉइड 2.x या 3.x पर है, तो यह सामान्य रूप से काम करता है। लेकिन अगर मैं सिस्टम सेटिंग बदलता हूं जो "डेवलपर विकल्प" में "क्रियाएँ न रखें" विकल्प का चयन करता है। त्रुटि नहीं दिखाती है।

मैं सिस्टम सेटिंग को बदलने के बिना इस त्रुटि से बचने के लिए अपना कोड संशोधित करना चाहता हूं। मैं इसे कैसे करूं?

उत्तर

41

मुझे लगता है कि यह managedQuery कॉल + आप कर्सर को बंद करने के कारण है। इस विधि, का उपयोग कर, क्योंकि गतिविधि उचित समय पर आप के लिए क्या करेंगे कि प्राप्त फोन मत करो करीब() एक कर्सर पर:

चेतावनी: managedQuery() विधि के डॉक्स से। हालांकि, अगर आप प्रबंधित क्वेरी से कर्सर पर stopManagingCursor (कर्सर) को कॉल करते हैं, तो सिस्टम उस स्थिति में कर्सर को स्वचालित रूप से बंद नहीं करेगा और , आपको क्लोज़() को कॉल करना होगा।

एंड्रॉइड सिस्टम के लिए कर्सर को cursor.close(); पर कॉल करने के लिए छोड़ दें और कॉल न करें।

Note:managedQuery विधि बहिष्कृत है और यह से बचा जाना चाहिए, को लागू CursorLoaders बजाय। CursorLoaders के बारे में अधिक जानकारी developer.android.com पर मिल सकती है। अपने कोड में

+0

आपका उत्तर सही है। लेकिन मेरी एक और गतिविधि में एक ही त्रुटि है। इस तरह का कोड http://stackoverflow.com/questions/9426170/why-the-cusor-null। अगर कर्सर.क्लोस() को कॉल नहीं किया गया है, तो कई लूप चलाने के दौरान चचेरे भाई शून्य हो जाएगा। इससे कैसे बचें? – brian

+0

@brian शायद आपके अन्य प्रश्नों की समस्याएं आपके द्वारा किए जाने वाले संचालन के आकार की वजह से हैं। आप थंबनेल प्राप्त करने के लिए MediaStore.Images.Media' की पूर्ण क्वेरी करते हैं, और फिर थंबनेल प्राप्त करने के लिए कई सैकड़ों (या 1000 से अधिक) 'प्रबंधितQuery'' बनाते हैं (यदि आप चाहते हैं कि थंबनेल आपको 'मीडियास्टोर' से पूछताछ न करे इमेज। थंबनेल 'contentprovider?)। इसके अलावा आप कहते हैं कि कर्सर कभी-कभी शून्य होता है, लेकिन कर्सर पर बंद नहीं होने पर 'NullPointerException' फेंक दिया जाता है? – Luksprog

+0

उदाहरण के लिए, मेरे पास 2000 फोटो है। 1 से 1000 कामों के लिए लूप के लिए लेकिन 1000 से अधिक शून्य हो जाएगा। यदि NullPointerException का उपयोग कर सकते हैं तो कई फ़ोटो खुली नहीं हो सकती हैं। – brian

0

निकालें cursor.close(); यह काम ठीक निश्चित रूप से

1

समारोह, managedQuery() मान्य नहीं है।

कृपया getContentResolver() क्वेरी() का उपयोग करें।

पैरामीटर समान हैं।