Возможно, вы захотите создать расширение Map (с помощью AbstractMap) и переопределить связанные функции. В общем случае структура расширения должна иметь:
- Жесткий кеш в памяти с использованием обычной карты. Это должен быть объект кэша с привязкой к размеру. Вы можете использовать LinkedHashMap и переопределить removeEldesEntry (), чтобы проверить, превышен ли размер
this.objectMap = Collections.synchronizedMap(new LinkedHashMap() {
@Override
protected boolean removeEldestEntry(LinkedHashMap.Entry eldest) {
if (size() > HARD_CACHE_CAPACITY) {
// remove from cache, pass to secondary SoftReference cache or directly to the disk
}
}
});
- Если кеш превышен, положить его на диск
- Переопределите функцию get, чтобы сделать следующее: При первоначальном получении загрузите растровое изображение с диска на основе определенного соглашения об именах (связанного с ключом) и сохраните его в памяти. Примерно что-то вроде (прошу прощения за любую синтаксическую ошибку)
@Override
public Bitmap get(Object key) {
if(key != null) {
// first level, hard cache
if(objectMap.containsKey(key)) {
return objectMap.get(key);
}
// soft reference cache
if(secondaryCache.containsKey(key)) {
return secondaryCache.get(key);
}
// get from disk if it is not in hard or soft cache
String fileName = "Disk-" + key + ".txt";
File f = new File(cacheDir, fileName);
if(f.exists()) {
// put this back to the hard cache
Bitmap object = readFromReader(f);
if(object != null) {
objectMap.put((String)key, object);
return object;
}
}
}
return null; // unable to get from any data source
}
Точно так же ваш пут должен быть переопределен для записи на диск для последующего использования, поэтому при повторной инициализации приложения вы можете просто создать экземпляр расширения карты. Если вы хотите, вы также можете предварительно загрузить хэш-карту для самых последних использованных элементов в приложении. По сути, расширяя AbstractMap, вы получаете гибкие возможности, не убивая вашу память с этими 1000 растровыми изображениями. Надеюсь, это поможет