2011-04-01 9 views
7

मेरे ऐप में उपयोगकर्ता छवियां चुनते हैं और प्रोग्राम उपयोगकर्ताओं को छवियों पर बदलाव करने देता है। चूंकि वहां बहुत सारे एंड्रॉइड डिवाइस हैं, इसलिए मेरा प्रोग्राम कुछ उपकरणों पर क्रैश होता है जो कम ढेर आकार के होते हैं। मैं उपयोगकर्ता के फोन के लिए सर्वोत्तम फिट आयामों की गणना करना चाहता हूं ताकि वीएम बजट की वजह से यह क्रैश न हो। मैंने "पिक्से प्रो" से एक स्क्रीनशॉट जोड़ा है जो मैं वही कर रहा हूं जो मैं ढूंढ रहा हूं। मुझे "बिटमैप फैक्ट्री.ऑप्शन" के बारे में पता है, मेरी एकमात्र समस्या यह है कि छवि आयामों को तय करने का एक तरीका ढूंढना है जो वीएम बजट की वजह से ऐप को क्रैश नहीं करेगा।वीएम बजट से अधिक नहीं होने के लिए इष्टतम छवि आकार का चयन कैसे करें?

enter image description here

उत्तर

12

की गणना करें नि: शुल्क अंतरिक्ष फोन पर शेष लगता है() .maxMemory() - कुल ढेर सीमा आकार (बाइट्स में) देता है।

Debug.getNativeHeapAllocatedSize() - आपके आवेदन (बाइट्स में) द्वारा पहले से उपयोग किए गए डेटा की मात्रा लौटाता है।

बिटमैप आप इस सूत्र द्वारा उपयोग कर रहे हैं के आकार की गणना,

long Bytes_allocated = (height of the Image) * (width of the Image) * 4;

freeMemory और Bytes_allocated तुलना करें आपके आवेदन के लिए उपयुक्त आकार का चयन करने के लिए।

1

मैं वास्तव में दो कारणों के लिए फोन पर छवियों को संपीड़ित करने समाप्त हो गया। एक अपलोड गति थी और दूसरा एक ढेर समस्या थी। आप कुछ ऐसा करने का प्रयास कर सकते हैं, या कम से कम स्टैक ट्रेस पोस्ट कर सकते हैं!

long freeMemory = (Runtime.getRuntime().maxMemory()) - (Debug.getNativeHeapAllocatedSize());

जहां,

Runtime.getRuntime:

0

अब तक मुझे छवि आकार बनाम उपलब्ध स्मृति से निपटने का कोई विश्वसनीय तरीका नहीं मिला है। समस्या यह है कि स्मृति बहुत तेज़ी से विभाजित हो जाती है, ताकि आपके पास 10 एमबी मुक्त हो, लेकिन 2 एमबी छवि के लिए कोई संगत स्थान न हो। वास्तव में सबसे बड़ी खाली जगह का आकार क्या है, लेकिन इसे पाने का कोई तरीका नहीं दिखता है। मेमोरी डिफ्रैगमेंट करने का एक तरीका बेहतर होगा, लेकिन इसके लिए कोई भी फ़ंक्शन मौजूद नहीं है।

फिर भी यदि आपकी उपलब्ध स्मृति छवि से कम है, तो आप सुनिश्चित कर सकते हैं कि यदि आप इसका उपयोग करने का प्रयास करते हैं तो आप क्रैश होने जा रहे हैं, इसलिए इसका उपयोग करने से पहले कम से कम जांच करने के लिए कुछ योग्यता है।

2012 के अंतराल के साथ अब 1920x1280 संकल्प के साथ, अब हमें एक पृष्ठभूमि छवि के लिए 20 एमबी निरंतर स्मृति की आवश्यकता है! ऐसा लगता है कि इनमें से कुछ टैबलेट अब 256 एमबी तक ढेर की इजाजत दे रहे हैं, लेकिन अधिक वीएम स्पेस को फेंकने के दौरान यह हल हो जाता है, हमें वास्तव में मेमोरी डिफ्रैगमेंटर या आरक्षित जगह के लिए एक तरीका चाहिए।

एक चाल है जो छवि आकार को स्केल या संशोधित नहीं किया जा सकता है, और प्रत्येक बदली गई छवि एक ही आकार है और आप अपने ऐप को एंड्रॉइड 3 पर सीमित कर रहे हैं।0+:

Options opt2 = new BitmapFactory.Options(); 
opt2.inBitmap = mBitmap;  // reuse mBitmap to reduce out of memory errors 
mBitmap = BitmapFactory.decodeResource(getResources(), myDrawable, opt2); 

यह छवि के लिए समान स्मृति क्षेत्र mBitmap का पुन: उपयोग करेगा।