Android: стратегия Кэша изображений и размер кэша памяти

Я реализую систему кэша изображений для кэширования загруженного изображения.

Моя стратегия основана на двухуровневом кэше: уровень памяти и уровень диска.

Мой класс очень похож на класс, используемый в droidfu проекте

Мои загруженные изображения помещаются в hashmap, и Битовый массив objet перенесен в объекте SoftRererence. Также каждый образ сохраняется постоянно к диску. Если требуемое изображение не найдено в Hashmap> это будет искаться на диске, крытом тростником, и затем пододвигаться обратно в hashmap. Иначе изображение будет загружено с сети. Так как я храню изображения в физическое устройство momery, я добавил проверку на заповедник пространство устройства и остаюсь под 1M занятого места:

private void checkCacheUsage() {

        long size = 0;
        final File[] fileList = new File(mCacheDirPath).listFiles();
        Arrays.sort(fileList, new Comparator() {
            public int compare(File f1, File f2) {
                return Long.valueOf(f2.lastModified()).compareTo(
                        f1.lastModified());
            }
        });
        for (File file : fileList) {
            size += file.length();
            if (size > MAX_DISK_CACHE_SIZE) {
                file.delete();
                Log.d(ImageCache.class.getSimpleName(),
                        "checkCacheUsage: Size exceeded  " + size + "("
                                + MAX_DISK_CACHE_SIZE + ") wiping older file {"+file.toString()+"}");
            }
        }

    }

Этот метод называют когда-то afte записью на диск:

Random r = new Random();
        int ra = r.nextInt(10);

        if (ra % 2 == 0){
            checkCacheUsage();
        }

То, что я хотел бы добавить, является тем же, начинают работу, размер HashMap для предотвращения его вырастет слишком много. Что-то вроде этого:

private synchronized void checkMemoryCacheUsage(){

            long size = 0;

            for (SoftReference a : cache.values()) {

                final Bitmap b = a.get();

                if (b != null && ! b.isRecycled()){
                    size += b.getRowBytes() * b.getHeight();
                }

                if (size > MAX_MEMORY_SIZE){
                  //Remove some elements from the cache
                }

            }

            Log.d(ImageCache.class.getSimpleName(),
                    "checkMemoryCacheUsage: " + size + " in memory");

    }

Мой вопрос: Каково могло быть правильное значение MAX_MEMORY_SIZE? Кроме того, действительно ли это - хороший подход? Хороший ответ также мог быть: "Не делайте этого! SoftReference уже достаточно"

11
задан Sagar 7 May 2017 в 21:07
поделиться

1 ответ

Не делай этого! SoftReference уже достаточно! На самом деле SoftReference создан для того, чтобы делать именно то, что вам нужно. Иногда SoftReference не делает то, что вам нужно. Затем вы просто избавляетесь от SoftReference и пишете свою собственную логику управления памятью. Но если вы используете SoftReference, вам не стоит беспокоиться о потреблении памяти, SoftReference сделает это за вас.

8
ответ дан 3 December 2019 в 10:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: