2013-06-11 7 views
16

मैं एक छवि गैलरी ऐप लिख रहा हूं और मैं स्मृति त्रुटियों से बाहर चल रहा हूं। मैं अपनी सभी छवियों को कैश करता हूं लेकिन समस्या तब होती है जब मैं छवियों के बीच वास्तव में तेज़ के बीच स्विच करने का प्रयास करता हूं। मुझे लगता है कि ऐप जीसी के मुकाबले मेमोरी को तेजी से आवंटित कर रहा है, क्योंकि उन्हें मुक्त करने का समय है (क्योंकि क्रैश तब नहीं होता जब मैं धीरे-धीरे छवियों को स्विच करता हूं)।एंड्रॉइड: bigHeap = "true" सम्मेलन?

दिनों के लिए इस समस्या के खिलाफ मेरे सिर को टक्कर देने के बाद, मैंने आखिरकार मैनिफेस्ट फ़ाइल में बड़ी हिप सेटिंग देने का फैसला किया। इस सेटिंग के बाद, मेरा ऐप अब क्रैश नहीं होता है इससे कोई फर्क नहीं पड़ता कि मैं छवियों के बीच कितनी तेज़ी से स्विच करता हूं।

अब, मैं जानना चाहता हूं कि बड़े हेप सेटिंग का उपयोग करने के लिए कोई सम्मेलन या सामान्य दिशानिर्देश है या नहीं, क्योंकि शायद, एक नोट लेने वाले ऐप ने बड़े पैमाने पर उपयोग किया है, तो शायद यह अधिक समझ में नहीं आता है। आम तौर पर, बड़े हेप सेटिंग के लिए कौन से ऐप्स अच्छे उम्मीदवार हैं?

धन्यवाद

+0

BTW, अगर आप 'bitmap.recycle() कहते हैं;' जैसे ही आप वाकई एक बिटमैप फिर से उपयोग नहीं कर रहे हैं, तो उस बिटमैप की स्मृति के थोक तुरंत मुक्त हो जाएगा। (जब जीसी इसके आसपास हो जाता है, तब भी यह सब एक छोटी वस्तु है।) – ToolmakerSteve

उत्तर

23

सामान्य शब्दों में, कौन से ऐप्स largeHeap की स्थापना के लिए एक अच्छे उम्मीदवार हैं?

वन्स जहां उपयोगकर्ता को सही साबित कर सकते तुम क्यों, स्मृति से बाहर उनके सभी अन्य एप्लिकेशन के लिए मजबूर कर रहे हैं आप ढेर अंतरिक्ष के एक outsized राशि देने के लिए।

व्यक्तिगत रूप से, मैं अर्हता प्राप्त करने के लिए "एक छवि गैलरी ऐप" पर विचार नहीं करता। ऑटोकैड, वीडियो संपादक, और जैसे योग्यता प्राप्त करेंगे।

अपने मेमोरी प्रबंधन समस्याओं के संबंध में, सुनिश्चित करें कि आप inBitmapBitmapOptions पर API स्तर 11+ पर चलते समय उपयोग कर रहे हैं, इसलिए आप कचरा संग्रह के माध्यम से मौजूदा बफर को रीसायकल करते हैं। विशेष रूप से एक छवि गैलरी के लिए, जहां आपके पास शायद काफी सटीक थंबनेल आकार हैं, मौजूदा बफर रीसाइक्लिंग का एक बड़ा लाभ होगा। इससे समग्र मेमोरी खपत (यानी, आप वास्तव में स्मृति से बाहर हैं) और स्मृति विखंडन (यानी, आपको OutOfMemoryError बहुत ढेर स्पेस के साथ मिल सकता है, लेकिन आपके आवंटन के लिए पर्याप्त कोई भी ब्लॉक नहीं है, एंड्रॉइड के फ्रैककिन 'गैर- कचरा कलेक्टर compacting)।

आप मौजूदा छवि कैश कार्यान्वयन को देखने पर भी विचार कर सकते हैं, जैसे कि Picasso में यह देखने के लिए कि क्या कुछ सुझाव हैं जो आप सीख सकते हैं (या संभवतः पुन: उपयोग कर सकते हैं)।

+0

आपके उत्तर के लिए धन्यवाद! एक सवाल: मैं एक गैलरी ऐप भी बना रहा हूं, लेकिन मैं पहले से ही पिकासो का उपयोग कर रहा हूं और अभी भी आउटऑफमेमरी एरर है। आपको क्या करना सबसे अच्छा काम है? 'BigHeap = true' का उपयोग करके इस समस्या को ठीक किया जाता है; क्या आपको लगता है कि इस त्वरित फिक्स का उपयोग करने के अलावा मैं अन्य चीजें भी कर सकता हूं? – Karim

+3

@ कुकीकी: "आपको क्या लगता है कि सबसे अच्छी बात है?" - पता लगाएं कि आपकी असली समस्या क्या है। क्या आपके पास मेमोरी रिसाव है? क्या आप 'बिटमैप' ऑब्जेक्ट्स का पुन: उपयोग नहीं कर रहे हैं जहां आप कर सकते थे? इत्यादि। – CommonsWare

1

सबसे पहले, सुनिश्चित करें कि आप आवश्यक से बड़े बिटमैप्स लोड नहीं कर रहे हैं:
Load a Scaled Down Version into Memory


फिर, largeHeap प्रयास करने से पहले, मुक्त स्मृति करने की कोशिश अपने आप को जल्दी से:

आप जैसे ही आप वाकई एक बिटमैप फिर तो उस के थोक का उपयोग नहीं होगा, कर रहे हैं bitmap.recycle(); को कॉल करते हैं बिटमैप की मेमोरी तुरंत मुक्त हो जाएगी। (जब जीसी इसके आसपास हो जाता है, तो वह सब कुछ एक छोटी वस्तु है।)


नए Android संस्करण पर, वहाँ विकल्प (recycle के बजाय) है कि और अधिक प्रभावी हो सकता है:
Managing Bitmap Memory

व्यक्तिगत रूप से, मैं अभी भी recycle अक्सर उपयोग, खासकर अगर मैं एक अलग लोड हो रहा है हो सकता है आकार छवि, इसलिए reuse मौजूदा नहीं हो सकता है। तो
के रूप में पुराने टुकड़ा छोड़ देते हैं, सभी पुराने बिटमैप्स मैं recycle (, अगर पहुंच योग्य: इसके अलावा, मैं यह आसान अलग से नए मीडिया के "लोड हो रहा है", से कोड करने के लिए पुराने मीडिया के "उतराई" जब एक अलग टुकड़ा या गतिविधि के लिए बदल रहा है लगता है एक स्थिर क्षेत्र से, null पर सेट करें)।


कि क्या largeHeap का उपयोग करने के लिए अंगूठे का नियम है, यह के बाद आप वैकल्पिक तरीकों स्मृति उपयोग को कम करने के लिए कोशिश की है विचार करना है।

कोड अपने अनुप्रयोग ताकि आप यह बंद फिर से बदल सकता है, और अभी भी चलाते हैं।

उदाहरण के लिए, monitor your memory usage, और लोड बिटमैप "छोटा" अगर स्मृति तंग है। क्या उपयोगकर्ता वास्तव में नोटिस करेगा कि दी गई छवि उनके डिवाइस के "रेटिना" रिज़ॉल्यूशन पर नहीं है?

या अगर यह एक पुराने, धीमी, डिवाइस है, largeHeap अपने अनुप्रयोग अनुत्तरदायी/झटकेदार महसूस करते हैं? यदि हां, तो क्या आप संकल्प को और भी आगे छोड़ सकते हैं, या एक बार पर कम बिटमैप्स दिखा सकते हैं?

बिनाlargeHeap [उपरोक्त तकनीकों द्वारा] के बिना अपने ऐप को सभी परिस्थितियों में काम करने के लिए प्राप्त करें। नोट: आप "फोर्स-टेस्ट" कड़े मेमोरी पर चल रहे हैं, कुछ "डमी" बिटमैप्स आवंटित करके, और वैश्विक क्षेत्रों में उनके संदर्भों को पकड़कर, इसलिए वे मुक्त नहीं हो सकते हैं।

अब आप, व्यापार बंद का मूल्यांकन करने के लिए यह अपने अनुप्रयोग को प्रभावित करता है के रूप में कर सकते हैं:

जब आप पर largeHeap कर देते हैं, भारी आपके एप्लिकेशन का उपयोग करते हैं - वहाँ स्थानों जहां यह अब "अधिक सुस्त" है, या एनिमेशन "स्टटर" या अन्यथा कम चिकनी लग रहा है? कम से कम एक पुराने डिवाइस पर परीक्षण करने के लिए सुनिश्चित करें, और एक उच्च वितरण डिवाइस पर। बड़े ढेर के कारण आप लंबे समय तक जीसी बार देख सकते हैं।

या आप निष्कर्ष निकाल सकते हैं कि largeHeap आपके लिए अच्छा काम कर रहा है, और अब आप आत्मविश्वास से कह सकते हैं कि यह आपके परिस्थिति में सबसे अच्छा विकल्प है।

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