blackberry - How to reduce memory when loading image from website? -
मैं इस उपयोगिता का उपयोग कर रहा हूं
सार्वजनिक वर्ग Util_ImageLoader {सार्वजनिक स्थिर बिटमैप _bmap; Util_ImageLoader (स्ट्रिंग यूआरएल) {HttpConnection कनेक्शन = शून्य; InputStream इनपुटस्ट्रीम = नल; एन्कोडेड छवि बिटमैप; बाइट [] डेटाअरे = नल; {Connection = (HttpConnection) कनेक्टर। ओपन (url + Util_GetInternet.getConnParam (), कनेक्टर.READ, सत्य) का प्रयास करें; इनपुटस्ट्रीम = connection.openInstreamStream (); बाइट [] प्रतिक्रियाडेटा = नया बाइट [10000]; Int लंबाई = 0; स्ट्रिंगबफ़र कच्चेरेस्पॉन्स = नया स्ट्रिंगबफर (); जबकि (-1! = (लंबाई = inputstream.read (responseData))) {rawResponse.append (नई स्ट्रिंग (प्रतिक्रिया डेटा, 0, लंबाई)); } Int responseCode = connection.getResponseCode (); यदि (responsecode! = HttpConnection.HTTP_OK) {नया IOEception ("HTTP प्रतिक्रिया कोड:" + responseCode); } अंतिम स्ट्रिंग परिणाम = rawResponse.toString (); डेटाअरे = परिणाम .getBytes (); } पकड़ (अंतिम अपवाद पूर्व) {} अंत में {try} {inputstream.close (); इनपुटस्ट्रीम = नल; connection.close (); कनेक्शन = नल; } पकड़ (अपवाद ई) {}} बिटमैप = एन्कोडेड इमेज .createEncodedImage (डेटाएरेरे, 0, डेटाअरेरे.लाइन); Int multH; Int multW; Int currHeight = bitmap.getHeight (); Int currWidth = bitmap.getWidth (); MultH = फिक्स्ड 32.div (फिक्स्ड 32.to एफपी (क्ररहाइट), फिक्स्ड 32. टॉफ़ पी (कूरहाइट)); // उल्ट multW = फिक्स्ड 32 डिव (फिक्स्ड 32. टॉफ़ पी (क्यूरवर्ड), फिक्स्ड 32. टॉफ़ पी (कर्नवर्विद)); // चौड़ाई बिटमैप = Bitmap.scaleImage32 (multW, multH); _bmap = bitmap.getBitmap (); } सार्वजनिक बिटमैप getbitmap () {वापसी _bmap; }} जब मैं इसे listfield पर कॉल करता हूं जिसमें 10 बच्चे होते हैं, तो लॉग जारी रहता है टाइमर आवंटित करने में विफल रहता है 0: कोई स्थान नहीं छोड़ा गया < / कोड>। इसका अर्थ है कि मेमोरी का उपयोग किया जा रहा है और फिर आवंटित करने के लिए कोई और स्मृति नहीं है और इसके परिणामस्वरूप मेरी मुख्य स्क्रीन प्रारंभ नहीं हो सकती।
उसी समय आपके पास स्मृति में निम्नलिखित ऑब्जेक्ट हैं:
// about 10KB बाइट का एक बफर [] प्रतिक्रियाडेटा = नया बाइट [10000]; // एक स्ट्रिंग बफर, जो कुल प्रतिक्रिया के आकार के आकार में बढ़ेगा Rareponse.append (नई स्ट्रिंग (प्रतिक्रिया डेटा, 0, लंबाई)); // स्ट्रिंग बफर अंतिम स्ट्रिंग परिणाम = rawResponse.toString () समान स्ट्रिंग एक और स्ट्रिंग; // अब प्रतिक्रिया का एक ही आकार बफर करता है। डेटाअरे = परिणाम .getBytes (); यदि आप एन एस्की वर्ण डाउनलोड करते हैं, तो कुल मिलाकर, आपके पास एक साथ 10 केबी, प्लस 2 * एन बाइट्स पहले यूनिकोड स्ट्रिंग बफर में, प्लस 2 * n बाइट्स में परिणाम < / Code> स्ट्रिंग, प्लस n बाइट्स में dataArray । अगर मैं गलत नहीं हूं, तो वह 5 एन + 10 के ऊपर बताता है अनुकूलन के लिए कमरा है। कुछ सुधार होंगे:
- पहले प्रतिक्रिया कोड की जांच करें, और फिर धारा पढ़ें यदि प्रतिक्रिया कोड HTTP 200 है। पढ़ने की आवश्यकता नहीं है कि क्या सर्वर एक त्रुटि लौटा दी।
- तारों से छुटकारा पाएं स्ट्रिंग में कनवर्ट करने की कोई ज़रूरत नहीं है, उसके बाद आप बाइट्स में फिर से कनवर्ट कर रहे हैं।
- यदि छवियां बड़ी हैं, तो उन्हें डाउनलोड करते समय रैम में संग्रहीत न करें। इसके बजाय, एक
FileOutputStream को खोलें और एक अस्थायी फ़ाइल पर लिखें जैसा आप इनपुट स्ट्रीम से पढ़ते हैं। फिर, यदि अस्थायी छवियां अभी भी बड़ी हैं, तो उन्हें डाउनस्केले प्रदर्शित किया जा सकता है।
Comments
Post a Comment