Was ist das bessere Laden von Bildern für ListView?

8

Ich frage mich, ob es besser ist, Bilder in einer Listenansicht aus dem Web zu laden, wenn die Anzahl der Threads, die gleichzeitig oder nacheinander ausgeführt werden, im Stapel durchläuft?

Ich habe bemerkt (aber ich weiß nicht, ob das wirklich die Implementierung ist) von der Youtube-App, dass die Bilder im Batch geladen werden und es ist irgendwie schnell. Selbst wenn Sie nicht nur Bilder laden, sondern auch Daten aus dem Internet anfordern möchten. Hat jemand eine Idee?

    
capecrawler 19.01.2010, 08:46
quelle

4 Antworten

6

"besser" auf welche Weise? Leistung weise? Entwicklerfreundlichkeit? Usability weise?

Ein paar grundlegende Dinge zu beachten:

  1. Das Erstellen von Threads ist teuer. Es ist langsam und jeder Thread verbraucht Systemressourcen (natürlich). Verwenden Sie bei der Erstellung eines einzelnen Threads für jeden Download einen verwalteten Capped-Threadpool.
  2. Laden Sie keine Bilder, wenn sie für den Benutzer nicht sichtbar sind. Was Sie tun sollten, ist in getView() Ihrer ListAdapter , überprüfen Sie, ob das Bild bereits geladen wurde, und wenn nicht, verwenden Sie einen Thread aus dem Thread-Pool, um die Arbeit zu erledigen.
  3. Seien Sie vorsichtig mit AsyncTask. Soweit ich weiß, verwaltet AsyncTask einen festen, anwendungsweiten Threadpool (ich denke, dass er auf 5 Threads beschränkt ist). Wenn also alle diese Threads gerade Bilder laden, wird jede andere Aufgabe, die Sie durch diese Klasse ausführen, blockiert.
  4. Erfinde das Rad nicht neu. Ist der ImageLoader von Droid-Fu löst dein Problem? Es implementiert auch einen Cache, so dass Bilder nicht doppelt heruntergeladen werden.
Matthias 19.01.2010, 12:23
quelle
1

Der beste Weg, diese Art von Funktionalität zu haben, besteht darin, dass die Bilder in der Liste "lazy load" haben. Wenn Ihre Liste eine feste Größe hat, führen Sie mehrere Threads aus (einen für jedes sichtbare Listenelement), laden Sie die Bilder herunter und aktualisieren Sie die Bilder in der Liste. In dieser Zwischenzeit muss ein Dummy-Bild an der gleichen Stelle platziert werden.

Halten Sie nur eine feste Anzahl von Bildkomponenten für Ihre Liste bereit, vorzugsweise ein paar mehr als die gesamten sichtbaren Bilder an einem beliebigen Punkt. Überprüfen Sie jedes Mal, wenn die Liste gescrollt wird, ob das Bild, das dem bestimmten Listenelement entspricht, existiert oder nicht. Wenn ja, Anzeige. Ist dies nicht der Fall, zeigen Sie das Dummy-Image an, führen Sie den Thread aus, um das Image im Hintergrund zu laden, und aktualisieren Sie das Listenbild, sobald der Download abgeschlossen ist.

Um den Speicher weiter zu speichern, können Sie 'SoftReferences' für die Bildkomponenten verwenden. Dadurch kann der Garbage Collector die Bilder entfernen, die gerade nicht auf dem Bildschirm angezeigt werden.

    
Kshitij Aggarwal 19.01.2010 09:45
quelle
1

Ich habe versucht, ein einfaches faules Listenbeispiel zu erstellen, das als Referenz verwendet werden kann, hier ist es Lazy Laden von Bildern in ListView

    
Fedor 08.07.2010 00:05
quelle
1

Ссылка

Dies ist möglicherweise das, wonach Sie suchen, verwendet einen Fixed-Thread-Pool und einen Soft-Cache, um Bilder zu laden.

    
stevelloyd 13.06.2011 19:47
quelle

Tags und Links