Wdrażam system pamięci podręcznej obrazu do buforowania pobranego obrazu.Android: Strategia pamięci podręcznej obrazu i rozmiar pamięci podręcznej
Moja strategia oparta jest na dwustopniowej pamięci podręcznej: Poziom pamięci i poziom dysku.
Moja klasa jest bardzo podobna do tej klasy stosowanych w droidfu project
Moje zdjęcia zostaną umieścić w hashmap i Objet Bitmap jest owinięty wewnątrz obiektu SoftRererence. Również każdy obraz jest zapisywany na stałe na dysku. Jeśli żądany obraz nie zostanie znaleziony w pliku Hashmap<String,SoftReference<Bitmap>>
, zostanie przeszukany na dysku, odczytany , a następnie z powrotem przeniesiony do mapy mieszającej. W przeciwnym razie obraz zostanie pobrany z sieci przez . Odkąd przechowywać obrazy do phisical momery urządzenia, dodałem czek na zachowanie przestrzeni urządzenia i pozostawać pod 1M zajętej przestrzeni:
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()+"}");
}
}
}
Metoda ta nazywana jest czasami afte piśmie dysku:
Random r = new Random();
int ra = r.nextInt(10);
if (ra % 2 == 0){
checkCacheUsage();
}
To, co chciałbym dodać, to taka sama kontrola rozmiaru HashMap, aby zapobiec jej nadmiernemu wzrostowi. Coś takiego:
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");
}
Moje pytanie brzmi: Co może być słuszną wartość MAX_MEMORY_SIZE? Co więcej, czy to dobre podejście? Dobra odpowiedź może również brzmieć: "Nie rób tego! SoftReference już wystarcza"
Można również rozważyć tę API http: //docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/cache/CacheBuilder.html – carfield