Android HashMap 序列化/反序列化

标签 android bitmap hashmap save

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

我的 hashmap 看起来像这样,最多包含 1000 个位图:

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

最佳答案

您可能需要考虑创建 Map 的扩展(通过使用 AbstractMap)并覆盖相关函数。一般来说,扩展的结构应该有:

  1. 使用常规 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
            }
        }
    });
  1. 如果超出缓存,则将其放入磁盘
  2. 覆盖 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/

相关文章:

java - HashMap 搜索和匹配正则表达式

java - 使用 Maps 进行字符串数据操作以处理非常大的数据输入

java - 在Java中序列化键值对的HashMap并将其转换为格式化字符串

java - Android 在 ListPreference 上崩溃

android - 在我的 Android 应用程序中显示 Word/PDF 文档

java - 位图未在 ListView 中显示 : Images from SD Card

android - 分配跟踪器或堆分析器可以帮助跟踪 'bitmap size exceeds VM budget' 错误吗?

安卓 : Monitoring folder activity

java - 安卓未捕获异常

Android:位图到 RGBA 并返回