2011-11-10 11 views
11

मेरे पास bitmap है, इसलिए मैं एक webserivceas स्ट्रिंग अपलोड करना चाहता हूं और स्ट्रिंग को पुनः प्राप्त करना चाहता हूं।बाइट आवंटन पर स्मृति से बाहर (साबुन का उपयोग कर webservice के लिए स्ट्रिंग के रूप में बिटमैप)

स्ट्रिंग के लिए बिटमैप परिवर्तित करने के लिए उपयोग कर रहा हूँ:

ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); 
byte[] byteArray = stream.toByteArray(); 

strBase64 = Base64.encodeToString(byteArray, Base64.URL_SAFE); 
इस

String ऊपर अपलोड करने के लिए soapobject में करने के लिए संपत्ति के रूप में उपयोग कर रहा है।

लेकिन Out of memory on a 11674900-byte allocation हो रही है, जबकि प्रिंट और अपलोड।

और अगर मैं इस मुद्दे को डिबग, मुद्रण के बिना कैसे इस समस्या को हल करने के लिए और upload image को स्ट्रिंग के रूप में वेब सेवा के लिए soaprequest.

पर

com.sun.jdi.InvocationException occurred invoking method. 

मिल रहा है?

उत्तर

9

आप 11 एमबी छवि (bitmap, stream, strBase64) की 3 प्रतियां बना रहे हैं। तो यह रेखा से नीचे

bitmap.recycle(); 

फोन करके स्मृति उपयोग को कम:

bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); 

इसके अलावा धारा को बंद जब आप (stream.toByteArray(); नीचे) इसके साथ किया जाता है:

stream.close(); 
stream = null; 

याद रखें कि इस बात की कोई गारंटी नहीं है कि इन कॉल के तुरंत बाद मेमोरी साफ हो जाएगी। इस प्रकार की स्थिति को संभालने का सही तरीका बड़ी फाइलों को खंड द्वारा खंडित करना है।

+0

यह बाइट्स सरणी द्वारा हल और साबुन अनुरोध से पहले क्रमबद्धता का इस्तेमाल किया है। – Udaykiran

+0

@ Udayakiran, मैं एक ही त्रुटि हो रहा है, क्या आप question.So में उल्लेख कृपया जिस तरह से आप यह समस्या ठीक बताओ। –

0

11 लाख बाइट आवंटन बहुत बड़ा की तुलना में सबसे अधिक फोन 'ढेर संभाल कर सकते हैं। आप निश्चित रूप से स्मृति में उस आकार के बाइट सरणी को पकड़ना नहीं चाहते हैं।

BitmapFactory.decodeStream साथ insample आकार का उपयोग करके देखें (InputStream है, रेक्ट outPadding, BitmapFactory.Options विकल्प चुनता)

और सेटिंग विकल्प insample आकार का उपयोग करने के लिए एक यथोचित आकार की छवि वापस जाने के लिए।

+0

क्या आप एंड्रॉइड फोन पर स्मृति में 11 एमबी डेटा संग्रहीत करना कह रहे हैं? –

+0

यह संभव हो सकता है, लेकिन या तो आपके फोन में इतनी मुफ्त मेमोरी नहीं है या यह जितनी जल्दी हो सके उतनी मेमोरी को डिलीकेट नहीं कर सकती है। –

-1

कुछ के लिए एक साधारण फिक्स एंड्रॉइड जोड़ने के लिए हो सकता है: configChanges = "ओरिएंटेशन | स्क्रीनसाइज" आपके मैनिफेस्ट में। मेरे मामले में, नेक्सस_S एमुलेटर इस लाइन के बिना दुर्घटनाग्रस्त हो रहा था, जबकि वास्तविक नेक्सस 7 डिवाइस जिस पर मैं परीक्षण कर रहा था, घूर्णन पर दुर्घटनाग्रस्त नहीं था।

जोड़ने से इस है कि एक जोड़े को बड़े "match_parent" बिटमैप बारी बारी से और आकार बदलने के लिए क्षुधा के लिए एक आसान ठीक प्रतीत होता है।

सावधान यदि आप 13 से पहले एपीआई के लिए निर्माण कर रहे हैं!

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

  • कोई संबंधित समस्या नहीं^_^