2012-11-04 31 views
7

मैं एक स्केच एप्लिकेशन बना रही हूँ ज्यादातर मनोरंजन के लिए जा रहा है। लेकिन मैं एक समस्या में भाग गया है।एंड्रॉयड पुनःआवंटन बिटमैप में "अज्ञात" स्मृति

मेरे एप्लिकेशन के भीतर, उपयोगकर्ता नमूने के माध्यम से "फ्लिप" कर सकते हैं वे पहले से ही तैयार कर लिया है। ये स्केच सिर्फ 400x800 बिटमैप्स हैं। लेकिन मैं लगातार स्मृति त्रुटियों से बाहर चला रहा हूँ।

रेखाचित्र के रूप में जल्द उपयोगकर्ता उनसे दूर flips के रूप में करने के लिए एसडी सहेजा जाता है और वे फिर से ...

if(bitmap != null) 
{ 
bitmap.recycle(); 
bitmap = null; 
} 

तो, केवल एक या दो बिटमैप किसी भी पर मेमोरी में लोड किया जाना चाहिए पुनः आवंटित की जाती रहे हैं समय, वे बचाए जाने और नष्ट करने से पहले। और कुछ डीबग प्रिंट्स के साथ, मैंने यह निर्धारित किया है कि यह सच है (एक ही समय में स्मृति में अधिकतम दो बिटमैप)। मेरी समस्या यह है कि 14 भार/विलोपन के बाद, प्रोग्राम आउटऑफमेमरी एरर के साथ दुर्घटनाग्रस्त हो जाता है। हमेशा 14, कोई फर्क नहीं पड़ता कि मैं "फ्लिप" के बीच कितनी देर प्रतीक्षा करता हूं।

मैं देखना क्या डिवाइस की स्मृति आवंटन की तरह है डी डी एम एस खोलने की कोशिश की है। आश्चर्यजनक रूप से, हर बार एक छवि को हटा दिया जाता है, स्मृति "मुक्त" खंड की बजाय "अज्ञात" खंड में जाती है। यह तब तक जारी रहता है जब तक कि "मुक्त" स्मृति का केवल एक स्लीवर न हो, जिस बिंदु पर दुर्घटना होती है (और "अज्ञात" स्मृति "मुक्त" हो जाती है)।

बहुत सारे गुगलिंग के बाद, मुझे कुछ संसाधन मिल गए हैं जो कहते हैं कि बिटमैप्स deallocated as expected, और Dalvik garbage collections always occur before an out of memory error होना चाहिए। और कुछ विविध पृष्ठों ने सुझाव दिया कि बिटमैप द्वारा उपयोग की जाने वाली सभी मेमोरी जीसी (मूल और जेवीएम ढेर के समान)

पर ध्यान दें, मुझे इस बिंदु पर ध्यान देना चाहिए कि मैं दो अलग-अलग फोनों पर परीक्षण कर रहा हूं। मोटोरोला Droid एक्स (स्टॉक छवि, एंड्रॉइड 2.3.3), और सैमसंग गैलेक्सी एस 3 (साइनोजनमोड 9, एंड्रॉइड 4.0.4)। दोनों एक ही व्यवहार का प्रदर्शन करते हैं। मेरे एंड्रॉइड टूल्स सभी एसडीके संस्करणों के साथ अद्यतित हैं, और मैंने यह सुनिश्चित करने के लिए दस लाख बार चेक किया है कि मेरे कोड में कुछ भी अजीब आवंटन नहीं कर रहा है (व्यावहारिक रूप से प्रोग्राम स्टार्टअप के बाद आवंटित नहीं किया गया है)।

तो, मुझे बिटमैप को सही तरीके से कैसे हटाया जाना चाहिए ताकि यह मुक्त हो (न केवल "अज्ञात"), और मैं कहीं और स्मृति का उपयोग कर सकता हूं? पूरक प्रश्न के एक प्रकार के रूप में, यह "अज्ञात" मेमोरी पूल क्या है, और इसके लिए क्या है?

संपादित करें: व्याकरण और वर्तनी, मंच पर कुछ नोट जोड़ता है।

+1

मैं आपकी समस्या को पुन: पेश करने की कोशिश की है की तुलना में आवेदन टैग सेट बड़े ढेर सच है.और, लेकिन कोई किस्मत में इस्तेमाल किया जा सकता है - मैं डीडीएमएस में कोई "अज्ञात" स्मृति नहीं देख सकता। क्या आप आंकड़े तालिका में प्रदर्शित "अज्ञात ऑब्जेक्ट" पंक्ति का प्रतिबिंबित कर रहे हैं, बीटीडब्ल्यू? क्या आप 'बिटमैप' उदाहरण बनाने के लिए उपयोग किए जाने वाले कोड को दिखाते हैं? –

+0

आप अपने बिटमैप को कैसे आकर्षित करते हैं? क्या यह setImageBitmap के माध्यम से एक ImageView से जुड़ा हुआ है? – Freddroid

+0

उपयोगकर्ता फ़्लिप करने के बाद, उस छविदृश्य का क्या होता है जो इसे आयोजित करता है? –

उत्तर

0

उपयोग बड़ी छवि (भी 1mb के पास)। आप अब तक androidmanifest कस्टम का उपयोग imageView का उपयोग नहीं देख (क्योंकि बहुत जटिल और अधिक से अधिक अन्य विचारों की जरूरत है)