2011-08-12 17 views
18

जैसा कि मैं इसे समझता हूं (यह नहीं कि मैं सही हूं) जब एप्लिकेशन उनके साथ समाप्त हो जाता है तो ड्रॉबल्स को आम तौर पर स्मृति से हटा दिया जाता है। हालांकि बिटमैप्स को मैन्युअल रूप से पुनर्नवीनीकरण की आवश्यकता होती है, और कभी-कभी उन्हें एक विशेष वर्ग भी ठीक से संभालने के लिए लिखा जाता है।ड्राइंग योग्य बनाम एकल पुन: प्रयोज्य बिटमैप स्मृति के साथ बेहतर है?

myView.setBackgroundDrawable(getResources().getDrawable(R.drawable.my_image)); 
myView1.setBackgroundDrawable(getResources().getDrawable(R.drawable.my_image1)); 
myView2.setBackgroundDrawable(getResources().getDrawable(R.drawable.my_image2)); 
तो जैसे कुछ

बजाय बिटमैप के साथ:

Bitmap tmpBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.my_image); 
myView.setImageBitmap(tmpBitmap); 

tmpBitmap.recycle(); 
tmpBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.my_image1); 
myView1.setImageBitmap(tmpBitmap); 

tmpBitmap.recycle(); 
tmpBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.my_image2); 
myView2.setImageBitmap(tmpBitmap); 
tmpBitmap.recycle(); 

मैंने मेरा प्रश्न स्मृति और लीक के संबंध में है, यह करने के लिए अधिक फायदेमंद बस इस तरह की तरह ड्रॉएबल साथ रहना है यह भी पढ़ें कि आपको बिटमैप्स पर रीसायकल() विधि के बारे में सावधान रहना होगा क्योंकि उन्हें अभी भी उपयोग में हटाया जा सकता है? ऐसा लगता है कि इन मुद्दों को विभिन्न रूपों में पॉप अप करना जारी रहता है, लेकिन मुझे इस मामले पर किसी से भी सीधे जवाब नहीं मिल सकता है। एक व्यक्ति एक बिटमैप पुन: उपयोग और हर बार इस्तेमाल करने के बाद पुनरावृत्ति करने के लिए कहते हैं, और दूसरों का कहना है कि उपयोग ड्रॉएबल और एक unbindDrawables() विधि (इस मैं क्या प्रयोग कर रहे है):

private void unbindDrawables(View view) { 
    if (view.getBackground() != null) { 
     view.getBackground().setCallback(null); 
    } 
    if (view instanceof ViewGroup) { 
     for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { 
      unbindDrawables(((ViewGroup) view).getChildAt(i)); 
     } 
     ((ViewGroup) view).removeAllViews(); 
    } 
} 

कोई भी लागू अंतर्दृष्टि ज्यादा हालांकि सराहना की जाएगी । धन्यवाद

उत्तर

8

मैं रोमैन के प्रस्ताव को वापस लेता हूं, लेकिन मुझे यकीन नहीं है कि आपका प्रश्न आपकी वास्तविक समस्या को संबोधित कर रहा है। मुझे नहीं पता कि आप अपने विचारों के संदर्भों को कैसे संभालेंगे। हो सकता है कि आपके पास बस आपके आवेदन में मेमोरी लीक हो? एंड्रॉइड में बहुत सारी मेमोरी लीक Context से संबंधित हैं। जब DrawableView से जुड़ा हुआ है, तो ViewDrawable पर कॉलबैक के रूप में सेट किया गया है।

TextView myView = new TextView(this); 
myView.setBackgroundDrawable(getDrawable(R.drawable.my_bitmap)); 

ऊपर कोड स्निपेट में, इसका मतलब DrawableTextView जो अपने आप Activity (Context) के लिए एक संदर्भ है के लिए एक संदर्भ जो बारी-बारी संदर्भ काफी कुछ भी अपने कोड के आधार पर किया गया है है।

अपने कोड को अधिक देखे बिना मुझे लगता है कि नष्ट होने पर संग्रहीत ड्रॉबल्स कॉलबैक को null पर सेट करके आप सही रास्ते पर हैं।

+0

धन्यवाद, बहुत अच्छी जानकारी। मुझे findViewById (R.Id.Image_name) के माध्यम से मेरे विचार मिलते हैं; btw। निश्चित नहीं है कि यह किसी भी तरह संदर्भ के संदर्भ को छोड़ देता है या नहीं। –

9

बिटमैप्स को मैन्युअल रूप से पुनर्नवीनीकरण करने की आवश्यकता नहीं है। वे कचरे और अन्य वस्तुओं की तरह एकत्र कचरा हैं। इसी तरह आपको बहुत विशिष्ट परिस्थितियों को छोड़कर, ड्रॉबल्स को अनइंड करने की आवश्यकता नहीं है। ऐसा लगता है कि आप बहुत भ्रामक जानकारी पढ़ते हैं।

पुनर्चक्रण बिटमैप्स और unbinding drawable (यदि आपके एप्लिकेशन बिटमैप डेटा की बड़ी मात्रा में हेरफेर उदाहरण के लिए या यदि आप एक स्थिर तरीके से drawable की दुकान।) कुछ स्थितियों में उपयोगी हो सकता है

दो उदाहरण आप शुरुआत में दिखाने आपके प्रश्न के बराबर हैं। यदि आप सीधे ड्रॉइंग लोड करते हैं, तो आपकी तरफ से बिटमैप्स लोड हो जाएंगे। यदि आप मैन्युअल रूप से बिटमैप्स लोड करते हैं और उन्हें एक छवि दृश्य पर सेट करते हैं, तो वे आपकी तरफ से ड्रॉबल्स में संलग्न होंगे।

पहले समाधान का उपयोग करें क्योंकि यह आसान है और जब तक आपको वास्तव में आवश्यकता न हो, तब तक अनबाइंडिंग और अन्य मेमोरी प्रबंधन तकनीकों के बारे में चिंता न करें।

+0

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

+3

आपको बिटमैप्स के बारे में बहुत सावधान पूर्व-हनीकॉम होना चाहिए। प्री-हनीकॉम्ब, बिटमैप्स को रैम स्पेस में आवंटित किया जाता है जो जावा कचरा कलेक्टर तक नहीं पहुंच सकता है। यह स्मृति रिसाव की ओर जाता है। यदि आप हनीकॉम पर हैं और बाद में, आप सही हैं। –

+1

तथ्य यह है कि देशी ढेर पर बिटमैप्स आवंटित किए गए थे, जिससे स्मृति रिसाव नहीं हुआ। इसका मतलब यह था कि बिटमैप को मुक्त करने से पहले आपको फाइनलरों को चलाने के लिए इंतजार करना होगा। –