2011-11-02 10 views
20

के साथ "रीसाइक्लिंग बिटमैप" त्रुटि का उपयोग करने का प्रयास: मेरा ऐप काफी बड़ी छवियों को लोड कर सकता है। स्मृति-रूढ़िवादी करने के प्रयास में, मैं लोड करने के लिए एक अस्थायी बिटमैप उपयोग करने का प्रयास कर रहा हूँ और एक अन्य परिवर्तन के बाद अंतिम छवि के लिए:एंड्रॉइड: अस्थायी बिटमैप्स

..... 
finalBitmap.recycle(); 
finalBitmap = null; 
Bitmap tempBitmap = BitmapFactory.decodeStream(fin, ...); 
finalBitmap = Bitmap.createBitmap(tempBitmap, ....); 
imgview.setImageBitmap(finalBitmap); 
..... 

अब, इस बिंदु पर हम tempBitmap, जो था पूरे कर चुके हैं केवल बिटकमैप बनाने में परिवर्तन चरण में डीकोडेड बिटमैप को परिवहन करने की आवश्यकता है। तो:

..... 
tempBitmap.recycle(); 
tempBitmap = null; 
..... 

और ... यह एक "एक पुनर्नवीनीकरण बिटमैप का उपयोग करने की कोशिश कर" विशेष रूप से tempBitmap की रीसाइक्लिंग की वजह से त्रुटि के साथ दुर्घटनाओं। tempBitmap प्रदर्शित नहीं किया गया था और केवल का उपयोग किया गया है

क्या गलत हो रहा है? मैं सिर्फ "finalBitmap" का उपयोग करना चाहिए भर में और createBitmap पर भरोसा करते हैं तो इसे प्रबंधित करने (finalBitmap = Bitmap.createBitmap (finalBitmap, ....))? मैं यह देखने में असफल रहा कि tempBitmap पर चल रही निर्भरता क्या होगी जिससे ऐसी विफलता होगी।

संपादित करें: हाँ, अशक्त काम उचित, अंतिम कचरा संग्रहण में परिणाम लगता है, लेकिन मैं क्यों रीसायकल() एक अस्थायी बिटमैप पर इस मामले में तो समस्याग्रस्त है के रूप में चक्कर में पड़ कर रहा हूँ। मुझे लगता है कि बिटमैप() को संदर्भित किया जा रहा है, लेकिन क्यों, और कितनी देर तक?

उत्तर

25

सीधे एंड्रॉयड documentation से:

स्रोत बिटमैप की निर्दिष्ट उपसमूह से अपरिवर्तनीय बिटमैप देता है। नया बिटमैप स्रोत के समान वस्तु हो सकता है, या एक प्रति हो सकती है।

ऐसा लगता है कि createBitmap फ़ंक्शंस में आपके द्वारा प्रदत्त बिटमैप का पुन: उपयोग करने की क्षमता है। यदि ऐसा है, तो आपको अस्थायी बिटमैप रीसायकल नहीं करना चाहिए क्योंकि आपका अंतिम बिटमैप इसका उपयोग कर रहा है। एक बात आप कर सकते हैं

if(tempBitmap != finalBitmap) { 
    tempBitmap.recycle(); 
} 

यह केवल tempBitmap रीसायकल चाहिए जब यह finalBitmap के रूप में ही नहीं है। कम से कम ऐसा लगता है कि प्रलेखन का अर्थ क्या है।

+1

मुझे इसके बारे में थोड़ा सा याद आया संभावित रूप से एक ही वस्तु है। अस्थायी रूप से मेरी सेटिंग को साइड इफेक्ट्स का कारण नहीं बनता है क्योंकि यह वास्तव में ऑब्जेक्ट को रिलीज़ नहीं करता है, जबकि रीसायकल() सीधे इसे प्रभावित करता है। हम्म। मैं आपका जवाब स्वीकार करता हूं और आशा करता हूं कि आप मुझे मेरे प्रश्न को ऊपर उठाने का पक्ष करेंगे (क्योंकि मुझे लगता है कि यह लोगों के लिए जानकारी का एक उपयोगी हिस्सा है)। – MartyMacGyver