/ / "रनटाइम अपवाद: पुनर्नवीनीकरण बिटमैप का पुन: उपयोग करने का प्रयास" - एंड्रॉइड, बिटमैप, रीसायकल

"रनटाइम अपवाद: पुनर्नवीनीकरण बिटमैप का पुन: उपयोग करने का प्रयास कर रहा है" - एंड्रॉइड, बिटमैप, रीसायकल

मेरे पास एक टुकड़ा है जिसमें एक साधारण व्यूपेजर होता है जो एक खंडस्टेटपेजर एडेप्टर का उपयोग करता है।

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

मुझे त्रुटि मिलती है "रनटाइम अपवाद:पुनर्नवीनीकरण बिटमैप का पुन: उपयोग करने की कोशिश कर रहा है" जब मैं फिर से सूची में जाने के लिए बैक बटन का उपयोग करता हूं और फिर से उसी आइटम (टुकड़ा) का चयन करता हूं। इस क्षण में मैं एप्लिकेशन आउटपुट में लॉग देख सकता हूं ondestroy विधि से

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

इंटरनेट से एक छवि डाउनलोड होने पर कॉल की जाने वाली विधि में यह स्निपेट होता है:

result = Bitmap.CreateBitmap (maskDrawable.IntrinsicWidth, maskDrawable.IntrinsicHeight, Bitmap.Config.Argb8888);
Paint paint = new Paint ();
paint.SetXfermode (new PorterDuffXfermode (PorterDuff.Mode.SrcAtop));
Canvas canvas = new Canvas (result);
if(canvas != null && mask !=null && scaledBitmap != null && result != null)
{
canvas.DrawBitmap (mask, 0, 0, null); //error here
canvas.DrawBitmap (scaledBitmap, 0, 0, paint);
}
if (imageBackground != null && activity != null)
{
activity.RunOnUiThread (() => imageView.SetImageBitmap(result));
}

व्यूअर खंड से onDestroy विधि:

public override void OnDestroy ()
{
Console.WriteLine ("ondestroy viewpagerfragment");
base.OnDestroy ();
if (infoBtn != null)
{
infoBtn.Click -= ShowInfoDialog;
}
FileDownloader.DownloadCompletedEvent -= HandleDownloadCompletedEvent;
imageView.SetImageBitmap(null);

if (result != null)
{
Console.WriteLine ("result RECYCLED");
result.Recycle ();
result = null;
}
if (drug != null)
{
drug.Recycle ();
drug = null;
}
if (mask != null)
{
mask.Recycle ();
mask = null;
}
}

उत्तर:

जवाब के लिए 0 № 1

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