安卓HashMap序列化/反序列化

3

你好,我有一个位图哈希表,需要将其存储在Android设备上,在下次应用程序启动时使用。

我的哈希表长这样,包含高达1000个位图:

private static HashMap <String, Bitmap> cache = new HashMap<String, Bitmap>();

对于相同的问题我也很感兴趣。 - cV2
1个回答

0
你可能想考虑创建 Map 的扩展(使用 AbstractMap),并覆盖相关函数。一般来说,扩展的结构应该包括:
  1. 使用常规 Map 的内存硬缓存。这应该是一个大小受限的缓存对象。你可以利用 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
            }
        }
    });
  1. 如果缓存超过限制,则将其放入磁盘
  2. 重写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方法必须被覆盖以将其放入磁盘以供以后使用,因此当您重新初始化应用程序时,只需创建映射扩展的实例即可。如果您愿意,还可以通过最近在应用程序中使用的项目预加载哈希映射。基本上,通过扩展AbstractMap,您可以获得灵活性,而不会用那1000个位图杀死您的内存。希望这有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接