2012-08-02 20 views
5

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

बिटमैप्स को पुन: उपयोग करने की आवश्यकता है जब हम इसका उपयोग नहीं कर रहे हैं। मुझे डेस्ट्रॉय() या व्यू क्लास में दूरस्थ रूप से समान कुछ भी नहीं दिखाई देता है। क्या कोई कॉलबैक विधि है जिसे मैं इसे प्राप्त करने के लिए ओवरराइड कर सकता हूं?

public void <insert_callback_here>() { 
    cachedBitmap.recycle(); 
} 

कोई एनीमेशन नहीं है। यह एक स्थिर छवि है। छवि को आकर्षित करने के लिए बहुत सी गणनाएं की गई हैं, इसलिए मैं इसे एक बार मेजर() पर कर दूंगा।

उत्तर

7

मैं यहां अपने उत्तर देने जा रहा हूं। ओवरराइड करने के लिए उचित तरीके onDetachedFromWindow है। मैं onDetachedFromWindow के अंदर अपने बिटमैप को हटा देता हूं, और चौड़ाई या ऊंचाई बदल गई है, तो उन्हें onMeasure के अंदर पुन: आवंटित करें।

@Override 
protected void onDetachedFromWindow() { 
    super.onDetachedFromWindow(); 
    if (cachedBitmap != null && !cachedBitmap.isRecycled()) { 
     cachedBitmap.recycle(); 
     cachedBitmap = null; 
     cachedBitmapWidth = -1; 
     cachedBitmapHeight = -1; 
    } 
} 

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    int viewWidth = MeasureSpec.getSize(widthMeasureSpec);; 
    int viewHeight = MeasureSpec.getSize(heightMeasureSpec);; 

    if (cachedBitmapWidth != viewWidth || cachedBitmapHeight != viewHeight) { 
     if (cachedBitmap != null) { 
      cachedBitmap.recycle(); 
     } 
     cachedBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
     cachedBitmapWidth = viewWidth; 
     cachedBitmapHeight = viewHeight; 
     Canvas canvas = new Canvas(cachedBitmap); 
     // do drawings here.. 
    } 

    setMeasuredDimension(viewWidth, viewHeight); 
} 
+0

यह वही है जो मुझे चाहिए। बस जोड़ने के लिए, मैंने बिटमैप्स को रीसाइक्लिंग के बाद System.gc() भी चलाया, क्योंकि मुझे पर्याप्त मेमोरी होने में समस्याएं थीं। –

+0

अच्छा है, लेकिन ऐप के बारे में सावधान रहें जहां आप क्रिएट() से खत्म करते हैं(): यह एक मेमोरी रिसाव कर सकता है (https://medium.com/square-corner-blog/android-leak-pattern- सदस्यताएं देखें -इन-विचारों-18f0860aa74c)। – RhetoricalRuvim

+0

यह भी महत्वपूर्ण है: मेजर() और ऑन ड्रा() पर अंदर कुछ भी आवंटित करना बुरा अभ्यास है। उदाहरण के लिए, आपके लेआउट पदानुक्रम के आधार पर, व्यूअर() को दृश्य के अंतिम आकार से पहले 2 या 3 बार कहा जाता है। SizeChanged() के अंदर पुन: आवंटन बेहतर होगा। – RhetoricalRuvim