Сериализация / десериализация Android HashMap - PullRequest
3 голосов
/ 16 мая 2011

Здравствуйте. У меня есть Hasmap с растровыми изображениями, которые мне нужно сохранить на устройстве Android, чтобы использовать при следующем запуске приложения.

Мой хэш-файл выглядит следующим образом и содержит до 1000 растровых изображений:

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

1 Ответ

0 голосов
/ 13 августа 2011

Возможно, вы захотите создать расширение Map (с помощью AbstractMap) и переопределить связанные функции. В общем случае структура расширения должна иметь:

  1. Жесткий кеш в памяти с использованием обычной карты. Это должен быть объект кэша с привязкой к размеру. Вы можете использовать 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
    }

Точно так же ваш пут должен быть переопределен для записи на диск для последующего использования, поэтому при повторной инициализации приложения вы можете просто создать экземпляр расширения карты. Если вы хотите, вы также можете предварительно загрузить хэш-карту для самых последних использованных элементов в приложении. По сути, расширяя AbstractMap, вы получаете гибкие возможности, не убивая вашу память с этими 1000 растровыми изображениями. Надеюсь, это поможет

...