Android Bildcaching - wie?

8

Ich denke, es ist gefragt und vor gefragt, aber dennoch gibt es Dinge, die ich nicht ganz verstehen kann.

Ich habe zwei verschiedene Ansätze ausprobiert:

  1. Behalten Sie alle Bilder im Speicher, wenn ein bestimmter Grenzwert überschritten wird, beginnen Sie, sie zu entfernen
  2. Lassen Sie Android dies mit SoftReferences
  3. beheben

In 2. es ist nur die Reinigung manchmal die Sekunde, die ich ihnen zuteile! Und ich zuteile nicht zu viel - 30-40 Bilder 50x50 Pixel.

Also bleibe ich bei einem. Die Frage ist, was ist die Grenze?

  1. Kann ich vom Gerät verlässliche Informationen darüber erhalten, wie viel Bitmap-Speicher ich noch habe? Ich habe etwas recherchiert, DDMS-Werte beobachtet, es nimmt nur mehr Platz ein (wenn ich nicht aufräume), bis es explodiert. Einen Moment sind nur noch 200K übrig, danach liefert das System 2M mehr ...
  2. Ich verwende derzeit eine heuristische Entscheidung, basierend auf dem Gerätemodell oder der Bildschirmgröße. Ich denke, das ist auf lange Sicht eine Sackgasse. Habe auf einigen Telefonen Speicherausnahmen, auf anderen völlig kostenlos.
  3. Gibt es eine dritte Lösung, die richtige?
Danail 29.07.2011, 16:00
quelle

5 Antworten

8

Wichtigste Frage: Haben Sie Ihre Bitmaps recycle() ? Dies ist sehr wichtig für Pre-Gingerbread-Anwendungen (vielleicht auch Post-Gingerbread).

Speicherverwaltung für Android-Apps von Google I / O 2011 hat mir geholfen, die Besonderheiten der Entwicklung für Android besser zu verstehen.

In diesem Video wird ein Tool mit dem Namen MAT - ein Memory Analyzer erwähnt, mit dem Sie feststellen können, ob Sie das getan haben in der Erinnerung herumhängende Objekte, die durchgesickert sind. Es ist möglich, dass du mehr als die 30-40 hast, die du zu haben glaubst.

Zum Anzeigen und / oder Protokollieren der aktuellen Größe des Heapspeichers usw. würde ich vorschlagen, den Code in diese Antwort zu Android Out of Memory-Ausnahmen .

    
dustmachine 10.08.2011, 21:31
quelle
4

Das Zwischenspeichern von Bildern war ein wesentlicher Bestandteil einer App, die ich erstellt und in den App Store gestellt habe. Die App muss Bilder herunterladen und sie sowohl im Speicher als auch auf der SD-Karte zwischenspeichern, so dass ihr Umfang sich über einen einzelnen Durchlauf hinaus erstreckt.

Die allgemeine Idee bestand darin, die Bilder einem Caching-Manager hinzuzufügen, der a) das Bild in einem assoziativen Container (HashMap) über einen Schlüssel basierend auf den Metadaten speichert und b) die Bilddatei auf die SD-Karte schreibt .

Während niedriger Speicherbedingungen gebe ich die HashMap frei. Dennoch können Bilder immer noch von der SD_Card abgerufen und erneut in den Speicher zwischengespeichert werden.

Ich konnte das ohne Recycling machen und sehe immer noch keine Speicherprobleme. Wie ich es verstehe, ist Recycling nicht notwendig, aber hilft, eine frühere Freigabe von Speicher für "Bitmaps" zu erhalten, da die Zuteilung für Bitmaps in Pre-Gingerbread-Betriebssystemen Native Memory verwendet. d.h. Speicher, der nicht Teil des Dalvik-Heaps ist. Der Garbage Collector befreit diesen Speicher also nicht, vielmehr wird er durch implementierungsspezifische Richtlinien freigegeben.

Dies stammt aus der Cache_Manager-Klasse:

%Vor%

// Hier ein Beispiel für writeImage () aus der File_Manager-Klasse

%Vor%     
paiego 15.08.2011 19:46
quelle
2

Das Limit bezieht sich auf die VM-Heap-Größe auf dem Gerät, auf dem es ausgeführt wird, da dies von Gerät zu Gerät und Betriebssystem zu Betriebssystem von 16 MB (insgesamt für die App) bis 256 MB (auf Tablets) reicht / p>

Sie müssen es entweder unter dem unteren Ende halten, verschiedene Builds pro Gerät erstellen oder die App zur Laufzeit prüfen lassen, was die Erlaubnis ist, und Ihre Bilder entsprechend laden.

Es gibt Methoden zum Überprüfen des freien Speicherplatzes im Heap und seiner Größe:

Diese API-Referenz unterstützt Sie bei den verfügbaren Methoden:

Ссылка

    
Hamid 29.07.2011 16:04
quelle
0

Aus einer höheren Perspektive ist das Laden und Zwischenspeichern von Bildern Teil des GreenDroid-Frameworks . Schau es dir an.

    
Romain Piel 15.08.2011 16:31
quelle
-2

Sie können ein WebView verwenden, um Bilder anzuzeigen, das Caching ist integriert. Plus, es unterstützt 2-Finger Zoom und Scroll, ohne besonderen Code.

    
NoBugs 15.08.2011 23:16
quelle

Tags und Links