Android ListView Images aus dem Internet via Thread

Holger

Aktives Mitglied
Hallo,

hab eine kleine Frage und zwar lade ich einige Images aus dem Web in einen ListView. Die ersten Bilder werden direkt geladen und damit der Listview nicht hackt lade ich die Bilder die am Anfang nicht sichtbar sind über Threads im Hintergrund nach. Das funktioniert soweit auch sehr gut, was mich nur wundert ist warum die Bilder die ich als erstes Lade auch bei den anderen Listview-Elementen angezeigt werden solange die eigentlichen Images noch nicht nach geladen sind.

Hier der Code:

Java:
if(textNews.getImg() != null){
			holder.topnews_img.setImageBitmap(textNews.getImg());
		}
		else{
			if(pos > 4){
				Thread t = new Thread(){
					public void run(){
						videoNewsList.get(pos).setImg(getBitMapFromUrl(img_url));
					}
				};
				t.start();
				
			}
			else{
				videoNewsList.get(pos).setImg(getBitMapFromUrl(img_url));
			}
		}

Vielleicht kann mir ja wer von euch helfen, bzw. einen Denkanstoss liefern der mich der Lösung dieser Problematik näher bringt.

Beste Grüße
Holger
 
Ist das ein Ausschnitt aus dem Adapter? Die getView-Methode wird jedes mal aufgerufen wenn sich etwas daran ändert welche Elemente angezeigt werden sollen.

In meinen Projekten verwende ich eine Klasse die folgendes kann: Sie lädt Bilder runter und speichert diese auf der SD-Card. Beim Aufruf der Klasse wird zu erst geprüft ob es das Bild schon auf der SD-Karte gibt und nur im Zweifelsfall runter geladen.
Während des Runterladens zeig ich einen Platzhalter an. Das funktioniert einwandfrei und verlässlich.

Ansonsten ist mir bei deinem Code noch aufgefallen:
1. Wenn du das Bild setzt nachdem es runter geladen wurde, musst du dem Adapter noch sagen, dass sich die Daten geändert haben. Dann wird neu gezeichnet. (notifyDataSetChanged)
2. Bei Threads immer aufpassen, dass es nicht zu Situationen kommen kann, dass UI-Code innerhalb eines fremden Threads ausgeführt wird. Ist in deinem Code nicht der Fall aber wenn du anfängst den Views zu sagen sie sollen neu zeichnen passiert das ziemlich schnell.
 
Hätte ich vielleicht dazu schreiben sollen, der Code-Ausschnitt befindet sich in der getView()-Methode.

Ich werde mir das mal mit der notifyDataSetChanged()-Methode ansehen, sollte diese in dem Thread ausgeführt haben oder wie sähe das exemplarisch aus?

Danke schon einmal für deine schnelle Antwort!
 
Hallo,

mein erster Gedanke ist, dass du gecachte Views verwendest. Dh. schaußt ob rowView, welcher als Parameter übergeben wird != null ist. Wenn ja benutzt du diese View, wo nach letzte Bild drinnen ist. Dh. du musst erstmal das Bild auf einen Default Wert setzten.

Am besten schaußt du dir mal diesen Blog Eintrag an: Multithreading For Performance | Android Developers Blog

Dort wird genau das Problem behandelt. Es gibt ein komplettes Beispiel Projekt auf googlecode. Dort wird dann auch speziell auf dein Problem eingegangen.

Ansonsten gibt es ein Prohekt namens LazyDrawables, kannste dir auch mal ansehen. Die versuchen dieses Problem allgemein zu lösen.
 

Neue Themen


Zurück
Oben