Я внедряю систему кэширования изображений для кэширования загруженного изображения.
Моя стратегия основана на двухуровневом кеше: Уровень памяти и уровень диска.
Мой класс очень похож на класс, используемый в проекте droidfu
Мои загруженные изображения помещаются в хэш-карту, а объект Bitmap
завернутый в объект SoftRererence. Также сохраняется каждое изображение
постоянно на диск.
Если запрошенное изображение не найдено в
Hashmap<String,SoftReference<Bitmap>>
он будет искать на диске,
читается, а затем возвращается в хэш-карту. В противном случае изображение будет
загруженный из сети.
Поскольку я храню изображения в физическом устройстве, я добавил чек, чтобы сохранить пространство устройства и остаться под 1М занимаемого пространства:
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()+"}");
}
}
}
Этот метод называется когда-нибудь записывающим:
Random r = new Random();
int ra = r.nextInt(10);
if (ra % 2 == 0){
checkCacheUsage();
}
То, что я хотел бы добавить, это такая же проверка размера HashMap, чтобы он не увеличился. Что-то вроде этого:
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? Кроме того, это хороший подход? Хороший ответ также может быть: "Не делайте этого! SoftReference уже достаточно"