ImageView: Bitmap wird automatisch recycelt, wenn ImageView nicht sichtbar ist (in ScrollView)

8

Also, ich habe mir eine Weile die ImageView-Quelle angesehen, aber ich habe noch keinen Haken dafür gefunden.

Das Problem: Wir haben 30 400x800 Bilder in einer ScrollView (die Anzahl der Bilder ist variabel). Da sie genau in den Bildschirm passen, benötigen sie jeweils 1,3 MB RAM.

Was ich möchte: Bitmaps für die ImageViews, die gerade in einer ScrollView sichtbar sind, laden / entladen. Wenn der Benutzer scrollt und die Bitmap nicht mehr sichtbar ist (innerhalb eines Abstandsschwellenwerts), sollte die Bitmap wiederverwendet werden, damit der Speicher von anderen Bitmaps in derselben ScrollView verwendet werden kann. Ich mache Downsampling und all das, also keine Sorgen. Bonus-Punkte, wenn Sie dies tun, indem Sie ImageView nur erweitern (ich möchte nicht mit der ScrollView, wenn möglich, zu stören).

Zusammenfassung: Ich kann die Bilder nur laden, wenn die ImageView sichtbar wird (mit einem cleveren Trick), aber ich weiß nicht, wann ich sie entfernen soll.

Hinweise: Ich kann dies aus anderen Gründen der Benutzerfreundlichkeit nicht mit einem ListView machen.

    
dmon 01.12.2011, 23:41
quelle

3 Antworten

5

Rufen Sie diese Methode auf, wenn Sie Ihre Bitmaps recyceln möchten.

%Vor%     
Pawan M 10.10.2013 11:03
quelle
1

Sehen Sie sich die Android-Dokumentation über "Wie zeichne Bitmaps" auch den Code an Beispiel namens Bitmap-Spaß.

Wenn Sie eine ListView oder eine GridView verwenden, werden die ImageView-Objekte wiederverwendet und die tatsächliche Bitmap wird freigegeben, um vom GC bereinigt zu werden.

Sie möchten auch die Originalbilder auf die Bildschirmgröße skalieren und sie auf Festplatte und / oder Arbeitsspeicher zwischenspeichern. Dies wird Ihnen viel Platz sparen und die tatsächliche Größe sollte auf ein paar hundert KB sinken. Sie können auch versuchen, die Bilder in der Hälfte der Auflösung Ihres Displays anzuzeigen. Das Ergebnis sollte immer noch gut sein, wenn viel weniger RAM verwendet wird.

    
philipp 23.10.2012 21:53
quelle
0

Was Sie wirklich wollen, ist ein ArrayAdapter dafür zu verwenden. Wenn, wie Ihre Notizen vermuten lassen, dies nicht möglich ist (obwohl ich nicht verstehe, warum), werfen Sie einen Blick auf die Quelle für den Array-Adapter und schreiben Sie einen für Ihre eigenen Bedürfnisse neu.

    
Paul Nikonowicz 02.12.2011 01:12
quelle