9

Android डेवलपर साइट के अनुसार, Bitmap.recycle() विधि परिभाषा है:जब (अगर बिल्कुल) मुझे Bitmap.recycle() का उपयोग करना चाहिए?

नि: शुल्क देशी इस बिटमैप के साथ जुड़े वस्तु, और पिक्सेल डेटा के संदर्भ में स्पष्ट

मैं कुछ विकसित किया है अनुप्रयोग जो बहुत सारे बिटमैप्स बना रहे/डीकोड कर रहे हैं, और परिणाम बिटमैप ऑब्जेक्ट्स को ImageView एस पर डाल दें।

बिटमैप आकार excceded वीएम बजट

और

स्मृति त्रुटि से बाहर

इसके अलावा मुझे यकीन है: कभी कभी मैं इस तरह के रूप में प्रसिद्ध अपवाद मिल गया है मेरे पास कोई मेमोरी लीक नहीं है जो इसका कारण बन सकती है।

कई खोजों के बाद, मैंने "रीसायकल" विधि की खोज की, और बिटमैप की मूल स्मृति को मुक्त करने के लिए इसका उपयोग नहीं किया। ऐसा लगता है जैसे यह बहुत की मदद करता है।

मैं पूछ रहा हूं कि ऐसा कुछ है जो मुझे इस स्थिति पर करना है, क्योंकि मुझे पता है कि सिस्टम इसे स्पष्ट रूप से कॉल किए बिना ऐसा कर रहा है (है ना? शायद मैं गलत हूं)।

क्या मुझे इस तरह की स्थितियों में इस विधि का उपयोग करना चाहिए?

मुझे इस प्रक्रिया का उपयोग किस स्थितियों में करना चाहिए?

क्या मुझे इस विधि का उपयोग करना चाहिए?

अग्रिम धन्यवाद।

अद्यतन:

गूगल ने हाल ही में this गाइड तैनात है, जो कहते हैं:

एंड्रॉयड 2.3.3 (एपीआई स्तर 10) और निचले पर, पुनरावृत्ति का उपयोग कर() की सिफारिश की है। यदि आप अपने ऐप में बड़ी मात्रा में बिटमैप डेटा प्रदर्शित कर रहे हैं, तो आप OutOfMemoryError त्रुटियों में भागने की संभावना रखते हैं। रीसायकल() विधि एक ऐप को जितनी जल्दी हो सके स्मृति को पुनः प्राप्त करने की अनुमति देती है।

+5

यह 'कॉल करने के लिए recyle' आवश्यक नहीं है। यह मदद कर सकता है, लेकिन केवल तभी जब आप इसे सही तरीके से उपयोग कर रहे हों। अपने 'बिटमैप' ऑब्जेक्ट में 'वीक रेफरेंस' बनाना वास्तव में बहुत आसान है और इसके बदले में वापस आना। [आपको यह Google आईओ टॉक देखना चाहिए] (http://www.youtube.com/watch?v=_CruQY55HOk) – adneal

+0

@aneal: धन्यवाद, वीडियो को बहुत समय पहले ही देखा गया है। –

उत्तर

3

मुझे किस स्थिति में इस विधि का उपयोग करना चाहिए?

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

तो रीसायकल() मतलब है कि आप स्मृति को मुक्त करने के यथाशीघ्र आप रीसायकल बुलाना चाहिए चाहते हैं()

मैं इस विधि का उपयोग करना चाहिए ??

यह एक उन्नत कॉल है, और सामान्य रूप से कहा जाता है की जरूरत नहीं है, जब वहाँ यह करने के लिए कोई और अधिक संदर्भ हैं सामान्य जीसी प्रक्रिया इस मेमोरी खाली होगा के बाद से bitmap.But आप की तरह बिटमैप आकार समस्याओं का सामना कर रहे हैं स्मृति त्रुटि से बाहर vm बजट या से अधिक हो गया है, तो आपको इसका उपयोग करने की आवश्यकता है।

0

मैं इसे संचालन में उपयोग करता हूं जहां मुझे पता है कि बिटमैप का अब और उपयोग नहीं किया जा रहा है।

public static Bitmap getMaskedContactImage (Context context, Bitmap contactImageBitmap, int maskToBeApplied) { 
    Bitmap mask = BitmapFactory.decodeResource(context.getResources(), maskToBeApplied); 
    Bitmap output = Bitmap.createBitmap(mask.getWidth(),mask.getHeight(), Config.ARGB_8888); 
    final Rect finalRect = new Rect(0, 0, contactImageBitmap.getWidth(), contactImageBitmap.getHeight()); 
    final Rect originRect = new Rect(0, 0, mask.getWidth(), mask.getHeight()); 
    Canvas canvas = new Canvas(output); 

    Paint xferPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
    xferPaint.setColor(Color.BLACK); 

    xferPaint.setXfermode(new PorterDuffXfermode(Mode.DST_IN)); 

    canvas.drawBitmap(contactImageBitmap, finalRect, originRect, null); 
    canvas.drawBitmap(mask, originRect, originRect, xferPaint); 

    contactImageBitmap.recycle(); 
    mask.recycle(); 

    return output; 
    } 

उस तरह के स्थानों में, मुझे यकीन है कि मैं मास्क या संपर्क इमेज का उपयोग नहीं कर रहा हूं।

मुझे बिटमैप प्रोसेसिंग के लिए वास्तव में अच्छा संसाधन मिला जो Displaying bitmaps सहायक हो सकता है।

सादर, एलेक्स