你好,我有一个位图的 Hasmap,我需要将其存储在 Android 设备上,以便在下次应用程序启动时使用。
我的 hashmap 看起来像这样,最多包含 1000 个位图:
private static HashMap <String, Bitmap> cache = new HashMap<String, Bitmap>();
最佳答案
您可能需要考虑创建 Map 的扩展(通过使用 AbstractMap)并覆盖相关函数。一般来说,扩展的结构应该有:
- 使用常规 Map 的内存硬缓存。这应该是一个大小绑定(bind)缓存对象。您可以利用 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 函数以执行以下操作:在初始 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
}
同样,您的 put 必须被覆盖以放入磁盘供以后使用,因此当您重新初始化您的应用程序时,您可以只创建 map 扩展的一个实例。如果需要,您还可以按应用程序中最近使用的项目预加载 HashMap 。基本上,通过扩展 AbstractMap,您可以获得灵 active ,而不会用那 1000 个位图占用您的内存。希望这有帮助
关于Android HashMap 序列化/反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6013422/