मैं डाउनलोड छवि कैशिंग के लिए एक छवि कैश सिस्टम लागू कर रहा हूं।एंड्रॉइड: छवि कैश रणनीति और मेमोरी कैश आकार
मेरी रणनीति दो-स्तर के कैश पर आधारित है: मेमोरी-स्तर और डिस्क-स्तर।
मेरी कक्षा बहुत एक SoftRererence ऑब्जेक्ट के अंदर लपेटा जाता है वर्ग droidfu project
में इस्तेमाल किया और बिटमैप objet मेरे डाउनलोड की गई छवियां एक hashmap में डाल दिया जाता है के समान है। इसके अलावा प्रत्येक छवि डिस्क पर स्थायी रूप से सहेजी जाती है। यदि कोई अनुरोधित छवि Hashmap<String,SoftReference<Bitmap>>
में नहीं मिली है तो इसे डिस्क पर पढ़ा जाएगा, और उसके बाद हैशैप में वापस धक्का दिया जाएगा। अन्यथा छवि नेटवर्क से डाउनलोड की जाएगी।
private void checkCacheUsage() {
long size = 0;
final File[] fileList = new File(mCacheDirPath).listFiles();
Arrays.sort(fileList, new Comparator<File>() {
public int compare(File f1, File f2) {
return Long.valueOf(f2.lastModified()).compareTo(
f1.lastModified());
}
});
for (File file : fileList) {
size += file.length();
if (size > MAX_DISK_CACHE_SIZE) {
file.delete();
Log.d(ImageCache.class.getSimpleName(),
"checkCacheUsage: Size exceeded " + size + "("
+ MAX_DISK_CACHE_SIZE + ") wiping older file {"+file.toString()+"}");
}
}
}
यह विधि एक डिस्क लेखन afte कुछ समय कहा जाता है:: जब से मैं phisical डिवाइस momery में छवियों की दुकान, मैं डिवाइस अंतरिक्ष संरक्षण और कब्जे वाले अंतरिक्ष के एक 1M के तहत रहने के लिए एक जांच को शामिल किया है
Random r = new Random();
int ra = r.nextInt(10);
if (ra % 2 == 0){
checkCacheUsage();
}
मैं जो जोड़ना चाहता हूं वह हैशैप आकार पर एक ही जांच है ताकि इसे बहुत अधिक बढ़ने से रोका जा सके। कुछ इस तरह:
private synchronized void checkMemoryCacheUsage(){
long size = 0;
for (SoftReference<Bitmap> a : cache.values()) {
final Bitmap b = a.get();
if (b != null && ! b.isRecycled()){
size += b.getRowBytes() * b.getHeight();
}
if (size > MAX_MEMORY_SIZE){
//Remove some elements from the cache
}
}
Log.d(ImageCache.class.getSimpleName(),
"checkMemoryCacheUsage: " + size + " in memory");
}
मेरा प्रश्न है: क्या एक सही MAX_MEMORY_SIZE मूल्य हो सकता है? इसके अलावा, क्या यह एक अच्छा दृष्टिकोण है? एक अच्छा जवाब भी हो सकता है: "ऐसा मत करो! सॉफ्ट रेफरेंस पहले से ही पर्याप्त है"
इस एपीआई http विचार कर सकते हैं: //docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/cache/CacheBuilder.html – carfield