ListView asynchrones Laden von Bildern

8

Ich habe derzeit einen ListView mit einem benutzerdefinierten Adapter, der Informationen erhält, die den Inhalt der Zeilen asynchron beschreiben. Teil jeder Zeile ist eine Bild-URL, die ich asynchron herunterladen und dann anzeigen möchte.

Mein aktueller Plan für eine Strategie zum Herunterladen dieser Bilder lautet:

  • Behalten Sie einen Cache mit Soft-Referenzen auf heruntergeladene Bitmap-Objekte.
  • Wenn ein getView () aufgerufen wird und sich die Bitmap im Cache befindet, setzen Sie die Bitmap für das ImageView direkt.
  • Wenn sich die Bitmap nicht im Cache befindet, laden Sie sie in einem separaten Thread, fügen Sie sie nach Abschluss des Downloads dem Cache hinzu und rufen Sie notifyDataSetChanged () auf dem Adapter auf.

Ich plane auch, ausstehende Downloads zu beenden, wenn das Activity-Objekt, das die onDestroy () - Methode der ListView besitzt (oder möglicherweise sogar in der onPause () -Methode) aufgerufen wird, aber am wichtigsten ist, dass ich den Download von ausstehenden Images abbrechen möchte wenn die Reihe vom Bildschirm verschwindet. Ich könnte den Download eigentlich nur nach einer kurzen Verzögerung abbrechen, so dass er wieder aufgenommen werden kann, ohne Bandbreite zu verschwenden, wenn die Zeile schnell wieder auf dem Bildschirm erscheint.

Ich bin jedoch über einige Dinge unsicher:

  • Was ist der beste Weg, um zu erkennen, wenn eine Zeile vom Bildschirm verschwindet, damit ich den Download abbrechen kann?
  • Benennt notifyDataSetChanged () das Beste nach dem Download oder gibt es einen besseren Weg?

Auch Kommentare zur gesamten Strategie wären willkommen.

    
JPvdMerwe 26.06.2011, 18:56
quelle

3 Antworten

8

Ich glaube nicht, dass der Aufruf von notifyDataSetChanged () wirklich benötigt wird ... Ich würde es so machen:

  • speichert die URL als Tag in der Ansicht, wenn sie erstellt / aktualisiert wird
  • registriert einen Listener im Downloader-Thread (async task ???) für den Download und behält den Verweis auf die Ansicht und die URL
  • Wenn ein Bild asynchron heruntergeladen wird, überprüfe ich TAG in der Ansicht und wenn es übereinstimmt - ich würde ImageView aktualisieren (wichtig im UI-Thread, aber wenn Async-Task verwendet wird). Das Bild sollte auch auf der SD-Karte gespeichert sein (und jedes Mal, wenn Sie eine URL anfordern, sollten Sie prüfen, ob es bereits heruntergeladen wurde).
  • Jedes Mal, wenn getView () die Ansicht wiederverwendet (die übergebene Ansicht ist nicht leer), würde ich das Tag (alte URL) überprüfen, durch die neue URL ersetzen und den Download von oldURL abbrechen.

Ich denke, es wäre so ziemlich (einige Fälle könnten passieren) ...

    
Jarek Potiuk 26.06.2011, 19:09
quelle
3

Ich verwende die Eigenschaften getFirstVisible und getLastVisible AdapterView, um die sichtbaren Zeilen zu erkennen und Anfragen in einen Stapel fester Größe zu stellen.

Mein Projekt ist Open Source und hat eine permissive Lizenz, wenn Sie es verwenden möchten: Ссылка

-Travis

    
Travis Biehn 23.09.2011 16:37
quelle
0

Ich fand das Remote Resource Management / Fetching im Quellcode von Foursquared sehr hilfreich:

Ссылка

Es speichert Bilder auf dem Datenträger und verarbeitet alle drei Ihrer Feature-Anforderungen. Sehen Sie sich einen Adapter für die Verwendung an.

Wenn Sie einen Download abbrechen möchten, wenn eine Zeile aus dem Bildschirm verschwindet, müssen Sie das selbst erledigen.

    
Cody Caughlan 26.06.2011 19:01
quelle

Tags und Links