2012-01-25 17 views
13

मैंने कई नमूनों में देखा है, डेवलपर्स बिटमैप पर recycle() पर कॉल करते हैं, और फिर इसे null पर सेट करते हैं। यह जरूरी क्यों है, कचरा कलेक्टर बिटमैप जारी करने का ख्याल नहीं रखता है?एंड्रॉइड - बिटमैप और मेमोरी प्रबंधन?

Bitmap bitmap = BitmapFactory.decodeStream(inputStream); 
bitmap.recycle(); 
bitmap = null; 

उत्तर

17

क्लब में शामिल हों। यह तरह का है लेकिन काफी नहीं है।

बात यह है कि एंड्रॉइड के प्री-हनीकॉम संस्करणों में बिटमैप्स के लिए स्मृति अप्रबंधित स्मृति से आवंटित की गई थी, जो सभी प्रकार की समस्याओं का निर्माण करती है। यह अभी भी जारी है लेकिन बिटमैप ऑब्जेक्ट कार्यान्वयन के अंतिमकर्ता से। जिसका अर्थ है कि इसे इकट्ठा करने के लिए जीसी के कम से कम 2 पास लगेंगे। इसके अलावा यदि किसी भी कारण से फाइनलर निष्पादित करने में विफल रहता है - आपको तस्वीर मिल गई है। एक और बात है - यह पता लगाने के लिए वास्तव में मुश्किल है - डी डी एम एस नहीं देखा है और न मेट करता

Android 3.0 के लिए

इस बदल दिया गया है और बिटमैप्स कामयाब बाइट सरणियों के ऊपर लागू किया जाता है, लेकिन पुराने फोन के लिए ...

3

bitmap.recycle(); बिटमैप्स में उपयोग की जाने वाली मूल ढेर को छोड़ दें। और इसे शून्य पर सेट करना जीसी को आपकी संदर्भ को तेज़ी से एकत्र करने में सहायता करना है।

+3

@ एरैक्सट: ध्यान दें कि जब अंतिमकर्ता आपके लिए 'रीसायकल()' करेगा, तो इसे स्वयं को स्मृति को जल्द ही रिलीज़ कर देगा, जिससे यह बहुत कम संभावना है कि आप ढेर स्पेस से बाहर हो जाएंगे। – CommonsWare

+1

हाँ .... नोट करने के लिए एक और बात .... आपको यह सुनिश्चित करने की ज़रूरत है कि बिटमैप का उपयोग आपके रीसायकल से पहले नहीं किया जाता है ... अन्यथा आप पुनर्नवीनीकरण बिटमैप का उपयोग करने का प्रयास करते समय अपवादों में भाग लेंगे। –

+4

एंड्रॉइड 3.0 बिटमैप्स के रूप में अब देशी ढेर का उपयोग नहीं करते हैं। –

1

http://developer.android.com/reference/android/graphics/Bitmap.html#recycle%28%29 पर दस्तावेज़ों से।


नि: शुल्क देशी इस बिटमैप के साथ जुड़े वस्तु, और पिक्सेल डेटा के संदर्भ में साफ़ करें। यह पिक्सेल डेटा को तुल्यकालिक रूप से मुक्त नहीं करेगा; यदि कोई अन्य संदर्भ नहीं है तो यह बस कचरा इकट्ठा करने की अनुमति देता है। बिटमैप को "मृत" के रूप में चिह्नित किया गया है, जिसका अर्थ यह है कि अगर पिक्सल() या सेट पिक्सल() कहा जाता है तो यह अपवाद फेंक देगा, और कुछ भी नहीं खींचा जाएगा। इस ऑपरेशन को उलट नहीं किया जा सकता है, इसलिए इसे केवल तभी बुलाया जाना चाहिए यदि आप सुनिश्चित हैं कि बिटमैप के लिए कोई और उपयोग नहीं है। यह एक उन्नत कॉल है, और आम तौर पर कॉल नहीं किया जाना चाहिए, क्योंकि इस बिटमैप के लिए कोई और संदर्भ नहीं होने पर सामान्य जीसी प्रक्रिया इस स्मृति को मुक्त कर देगी।


तो ऐसा कॉल करना जरूरी नहीं लगता है। एकमात्र बार मैंने कभी ऑब्जेक्ट को मैन्युअल रूप से सेट करने की आवश्यकता को सुना है, यदि यह एक स्थिर चर (या कुछ चर जो आसानी से गुंजाइश से बाहर नहीं जाएंगे) और आप इसे स्मृति से बाहर करना चाहते हैं। हो सकता है कि यदि आप लगातार बिटमैप्स आवंटित कर रहे हैं तो कचरा संग्रह को आजमाने और मजबूर करने की आवश्यकता हो सकती है, लेकिन अधिकांश मामलों के लिए इसकी आवश्यकता नहीं है।

+1

सभी दस्तावेज के अनुसार अच्छी तरह से प्रतीत होते हैं, लेकिन ऐसे कई मामले सामने आए हैं जहां बिटमैप ने ओओएम का कारण बना दिया है .... इसलिए यदि आप अपने कोड में इस समस्या का सामना करते हैं तो इसे ठीक करने का एक सामान्य तरीका यह सुनिश्चित करना है कि हम बिटमैप सेट करें शून्य और कोड से जीसी को कॉल करें ... (हाँ मुझे पता है कि यह इष्टतम नहीं है और यह जीसी के लिए गारंटी नहीं है) ... लेकिन यह कुछ याददाश्त वापस पाने का आखिरी उपाय रहा है .... आप भी कोशिश कर सकते हैं बिटमैप कैशिंग –

+0

के लिए सॉफ़्ट रेफरेंस का उपयोग करके मैंने एक बार में सैकड़ों बिटमैप्स को स्मृति में लोड किया है और कोई समस्या नहीं है।एकमात्र तरीका यह है कि मैं इसे देख सकता हूं कि आधुनिक फोन पर एक समस्या यह है कि यदि आप अपनी बिटमैप्स लीक कर रहे हैं या आप तेजी से आवंटित कर रहे हैं और बिटमैप्स को फेंक रहे हैं (आप एक बार में अपनी स्क्रीन पर फिट बैठ सकते हैं)। – onit

+0

http://code.google.com/p/android/issues/detail?id=11089 रोमैन लोगों की प्रतिक्रिया देखें .... –

0

This article from android development docs इस विषय पर बहुत सारी जानकारी है। जब आप इसमें हों तो कैशिंग के बारे में आलेख भी देखें यदि आप एकाधिक बिटमैप्स का उपयोग करेंगे।

संबंधित मुद्दे