Android: Image-Cache-Strategie und Speicher-Cache-Größe

Ich implementiere ein Bild-Cache-System zum Zwischenspeichern heruntergeladener Bilder.

Meine Strategie basiert auf einem Cache mit zwei Ebenen: Speicherebene und Festplattenebene.

Meine Klasse ist der in @ verwendeten Klasse sehr ähnlicdroidfu project

Meine heruntergeladenen Bilder werden in eine Hashmap eingefügt und das Bitmap-Objekt in ein SoftRererence-Objekt eingeschlossen. Außerdem wird jedes Bild dauerhaft auf der Festplatte gespeichert. Wenn ein angefordertes Bild nicht im @ gefunden wiHashmap<String,SoftReference<Bitmap>> Es wird auf der Festplatte gesucht, gelesen und dann zurück in die Hashmap verschoben. Andernfalls wird das Bild aus dem Netzwerk heruntergeladen. Da ich die Bilder im phisical device momery speichere, habe ich eine Überprüfung hinzugefügt, um den Speicherplatz des Geräts zu erhalten und weniger als 1 MB belegten Speicherplatz zu belegen:

private void checkCacheUsage() {

        long size = 0;
        final File[] fileList = new File(mCacheDirPath).listFiles();
        Arrays.sort(fileList, new Comparator<File>() {
            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()+"}");
            }
        }

    }

Diese Methode wird irgendwann nach dem Schreiben eines Datenträgers aufgerufen:

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

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

Was ich hinzufügen möchte, ist die gleiche Überprüfung der HashMap-Größe, um zu verhindern, dass sie zu stark anwächst. Etwas wie das

private synchronized void checkMemoryCacheUsage(){

            long size = 0;

            for (SoftReference<Bitmap> 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");

    }

Meine Frage lautet: Was könnte ein richtiger MAX_MEMORY_SIZE-Wert sein? Auch ist es ein guter Ansatz? Eine gute Antwort könnte auch sein: "Tu es nicht! SoftReference ist schon genug"

Antworten auf die Frage(6)

Ihre Antwort auf die Frage