छवि कैशिंग एक ऐप का एक महत्वपूर्ण हिस्सा था जिसे मैंने बनाया है और ऐप स्टोर में डाल दिया है।ऐप को छवियों को डाउनलोड करने और उन्हें स्मृति और एसडीकार्ड दोनों में कैश करने की आवश्यकता है ताकि उनका दायरा एक रन से आगे हो।
सामान्य विचार छवियों को एक कैशिंग प्रबंधक में जोड़ना था जो दोनों ए) मेटा-डेटा के आधार पर एक कुंजी के माध्यम से छवि को एक सहयोगी कंटेनर (हैश मैप) में संग्रहीत करता है, और बी) छवि फ़ाइल को लिखता है एसडी कार्ड।
कम स्मृति स्थितियों के दौरान, मैंने हैश मैप जारी किया। फिर भी छवियों को अभी भी SD_Card से पुनर्प्राप्त किया जा सकता है और एक बार फिर स्मृति में कैश किया जा सकता है।
मैं रीसाइक्लिंग के बिना ऐसा करने में सक्षम था और अभी भी कोई स्मृति समस्या नहीं देख पा रहा था। जैसा कि मैं इसे समझता हूं, रीसाइक्लिंग आवश्यक नहीं है लेकिन "बिटमैप्स" के लिए उपयोग की गई स्मृति की पुरानी रिलीज को प्राप्त करने में मदद करता है क्योंकि प्री-जिंजरब्रेड ओएस में बिटमैप्स के लिए आवंटन मूल मेमोरी का उपयोग करता है। यानी स्मृति जो दल्विक ढेर का हिस्सा नहीं है। तो कचरा कलेक्टर इस स्मृति को मुक्त नहीं करता है, बल्कि इसे कार्यान्वयन विशिष्ट नीतियों से मुक्त किया जाता है। ,
public static synchronized void addImage(Bitmap b, String urlString, boolean bSaveToFile, IMAGE_TYPES eIT, boolean bForce)
{
String szKey = getKeyFromUrlString(urlString, eIT);
if (false == m_hmCachedImages.containsKey(szKey) || bForce)
{
m_hmCachedImages.put(szKey, b);
if (bSaveToFile)
{
boolean bIsNull = false;
// Write a null object to disk to prevent future query for non-existent image.
if (null == b)
{
try
{
bIsNull = true;
b = getNullArt();
}
catch (NullPointerException e)
{
e.printStackTrace();
throw e;
}
}
// Don't force null art to disk
if (false == File_Manager.imageExists(szKey) || (bForce && bIsNull == false))
File_Manager.writeImage(b, szKey);
}
}
}
// यहाँ writeImage (का एक उदाहरण) File_Manager वर्ग से
public static void writeImage(Bitmap bmp, String szFileName)
{
checkStorage();
if (false == mExternalStorageWriteable)
{
Log.e("FileMan", "No Writable External Device Available");
return;
}
try
{
// Create dirctory if doesn't exist
String szFilePath = getFilesPath();
boolean exists = (new File(szFilePath)).exists();
if (!exists)
{
new File(szFilePath).mkdirs();
}
// Create file
File file = new File(szFilePath, szFileName);
// Write to file
FileOutputStream os = new FileOutputStream(file);
bmp.compress(Bitmap.CompressFormat.PNG, 90, os);
} catch (IOException e)
{
// Unable to create file, likely because
// external storage is
// not currently mounted.
Log.e("FileMan", "Error writing file", e);
} catch (Exception e)
{
e.printStackTrace();
throw e;
}
}
30-40 छवियों का आकार 30x50 ओओएमई का कारण नहीं बनना चाहिए। शायद आप बड़े लोड कर सकते हैं? यदि ऐसा है, तो आप उन्हें नीचे स्केल कर सकते हैं। इसके अलावा, अगर कुछ छवियों को सॉफ्ट रेफरेंस से साफ़ किया जाता है, तो उनका उपयोग नहीं किया जा रहा है, इसलिए यदि आवश्यक हो तो बस उन्हें पुनः लोड करें। –