2012-03-21 18 views
6

मेरे आवेदन में मैं सरल गैलरी और कवरफ्लो दोनों का उपयोग कर रहा हूं मेरे पास कवरफ्लो में क्लिक की गई छवि पर मेरी कवरफ्लो छवि गैलरी है, मुझे अगली गतिविधि पर रीडायरेक्ट किया गया है जो सामग्री पूर्ण स्क्रीन गैलरी और मैं अपनी पूर्णस्क्रीन गैलरी भी स्क्रॉल कर सकता हूं; लेकिन जब मैं अपने ऐप में अधिक मात्रा में छवि या उच्च रिज़ॉल्यूशन छवियों को डालता हूं तो बिटमैप आकार के कारण यह बंद हो जाता है क्योंकि वीएम बजटमेरे कोड में गतिशील रूप से ढेर मेमोरी को खाली या साफ़ करने के लिए

इसलिए हर बार जब मैं अपना कवर प्रवाह और गैलरी समाप्त करता हूं तो मैं हीप मेमोरी साफ़ करना चाहता हूं ताकि मैं कर सकूं मेरे ऐप में किसी भी राशि या किसी भी रिज़ॉल्यूशन छवि को लोड करें ताकि कोई मेरी मदद कर सके ... हर बार जब मैं अपने कोड में गतिशील रूप से अपनी गतिविधि समाप्त करता हूं तो हेप मेमोरी को खाली/खाली कैसे करें? मैंने पहले से ही रीसायकल और System.gc विधि

+0

आप पढ़ सकते हैं कि रोमैन लड़के ने ग्राफिक्स और बिटमैप्स के बारे में क्या कहा है। – JoxTraex

उत्तर

31

को आजमाया है "आप ढेर साफ़ नहीं कर सकते"। जब आपकी ऑब्जेक्ट्स का संदर्भ नहीं दिया जाता है तो वीएम स्वचालित रूप से ऐसा करेगा।

कहा जा रहा है कि, बिटमैप्स एंड्रॉइड में एक कठिन बात है। सीमित स्मृति है, और जब एक छवि बिटमैप में डीकोड की जाती है तो यह संपीड़ित छवि प्रारूप की तुलना में बहुत अधिक स्मृति ले सकती है।

आपके समाधान का कोई आसान जवाब नहीं है। यहां तक ​​कि यदि आप सब कुछ सही तरीके से करते हैं, तो आप बस स्मृति से बाहर हो सकते हैं। ऐसा कहा जा रहा है, यहां कुछ सुझाव दिए गए हैं:

  1. Bitmap.release() का उपयोग करें। बिटमैप्स विशेष हैं कि वे देशी ढेर (वीएम के विपरीत) ढेर पर आवंटित किए जाते हैं। जावाडॉक्स थोड़ा अस्पष्ट हैं, कह रहे हैं कि आपको सामान्य रूप से इसे कॉल करने की आवश्यकता नहीं है, लेकिन मेरे अनुभव में वीएम को यह "सुराग" है कि आप बिटमैप का समर्थन करने वाली स्मृति के साथ किए गए हैं। संपादित करें: एंड्रॉइड 3.0 (एपीआई स्तर 11) के रूप में, पिक्सेल डेटा संबंधित बिटमैप के साथ दलविक ढेर पर संग्रहीत किया जाता है।

  2. मेमोरी स्केल स्केल किए गए बिटमैप्स लोड करें। विषय पर blog post है। आपको केवल कुछ डिवाइसों पर 24 एमबी ढेर मिलते हैं और एक उच्च-रेज छवि उस सब को समाप्त कर सकती है जब इसे बिटमैप ऑब्जेक्ट में लोड किया जाता है। इसके चारों ओर कोई रास्ता नहीं है, इसलिए आपको इसे स्केल करना होगा।

  3. किसी अन्य उत्तर के रूप में System.gc() पर कॉल न करें। जिन लोगों ने जीसी एल्गोरिदम बनाया है वे आपके और मेरे से ज्यादा चालाक हैं; वे जानते हैं वे क्या कर रहे हैं। जब आप एक जीसी के माध्यम से मुक्त हो सकते हैं तो आपको कभी ओओएमई नहीं मिलेगी - जीसी हमेशा आपको ओओएमई देने से पहले चलेगा।

  4. यह एक स्पष्ट है, लेकिन सुनिश्चित करें कि जब आप की आवश्यकता नहीं है तो आप बिटमैप्स के संदर्भ नहीं रख रहे हैं।

  5. अंत में, और यह बेकार है, एंड्रॉइड ढेर compaction नहीं करता है। यहां एक SO question है जिसे मैंने कुछ समय पहले पोस्ट किया था, बिना किसी संतोषजनक उत्तर के। संक्षेप में, एंड्रॉइड कभी भी ढेर को कॉम्पैक्ट नहीं करता है, इसलिए जब आपका ऐप बिगमैप्स के लिए बड़े, या यहां तक ​​कि मध्यम आकार, आवंटित करता रहता है, तो अंततः आप ऐसी स्थिति में उड़ जाते हैं, जबकि आप स्मृति से बाहर नहीं होते हैं, वहां पर्याप्त पर्याप्त संगत नहीं होता है आपके आवंटन के लिए स्मृति का हिस्सा, और आप ओओएमई प्राप्त करते हैं। केवल इस तरह से, जैसा कि मैंने अपने प्रश्न में लिखा था, उपयोगकर्ता द्वारा छोड़े जाने पर ऐप की प्रक्रिया को मारना है। यह अगली बार स्टार्टअप धीमा कर देता है, लेकिन यह एक ब्रांड नए ढेर की गारंटी देता है। मुझे गलत मत समझो, मैं संभवतः विश्वास नहीं कर सकता कि यह सही काम है, लेकिन कोई भी बेहतर समाधान के साथ नहीं आया है।

+1

रोमैन की जानकारी +1 की अच्छी व्याख्या। – JoxTraex

+0

यह "रोमैन की जानकारी" नहीं है। मुझे नहीं पता कि आप किस बात का जिक्र कर रहे हैं। –

+0

वह Google पर यूई टूलकिट इंजीनियरों में से एक है जो आपने अभी कहा है वह मूल रूप से उसने कहा है। और उसका नाम हैडल रोमिंगिंग है। – JoxTraex

संबंधित मुद्दे