# Anzeigen der Daten dauert zu lange - Progressdialog?



## mysterix (24. Nov 2013)

Hiho, ich habe folgenden Code, der mir aus einer ArrayList mit eigenen Objekten (vom Typ "Film") die Oberfläche gestaltet. Dazu habe ich ein Linearlayout, das dann pro Eintrag der Liste, ein Custom View hinzugefügt bekommt. Dann werden auch gleich Name, Beschreibung, Genre und Bewertung gesetzt und angezeigt. Mein Problem: Das dauert einfach an die 2-3 Sekunden. Und das auf meinem Galaxy S4. Ich habe nun schon gelesen, dass man das Anzeigen eines "Wartebildschirmes" über einen ProgressDialog regeln kann. Leider bekomme ich es beim besten Willen nicht hin. Ich glaube mein Problem ist, dass nich das Berechnen irgendwelcher Daten lange dauert, sondern das erzeugen der Custom Views. Geht es denn dann überhaupt mit dem ProgressDialog? Ich bekomms jedenfalls nicht hin. Hat jemand eine Idee? Hier ist der Code, der aufgerufen wird, um mir meine Custom Views ("eintrag") zu erzeugen und am Ende dem LinearLayout("galerieeintraege") hinzuzufügen


```
private void DatenLaden()
	{
		try{

			int a = 0;
		
		LinearLayout layout  = (LinearLayout)findViewById(R.id.galerieeintraege);
		layout.removeAllViews();
		for (Film film : filme) 
		{
			if(film.getName() != null && filterkriterium == "Name")
				if(!film.getName().toLowerCase().contains(filterWert.toLowerCase()))
					continue;
			if(film.getBeschreibung() != null && filterkriterium == "Beschreibung")
				if(!film.getBeschreibung().toLowerCase().contains(filterWert.toLowerCase()))
					continue;
			if(film.getGenre() != null && filterkriterium == "Genre")
				if(!film.getGenre().toLowerCase().contains(filterWert.toLowerCase()))
					continue;
			if(filterkriterium == "Bewertung")
				{
				if(film.getBewertung() < Float.parseFloat(filterWert))
					continue;
				}
			
			a = a + 1;
			eintrag eintrag = new eintrag(Galerie.this);
			eintrag.setName(a + ".) " + film.getName());
			eintrag.setBeschreibung(film.getBeschreibung());
			eintrag.setGenre(film.getGenre());
			eintrag.setBewertung(film.getBewertung());
			eintrag.setStrichcode(film.getStrichcode());
			ImageView imageView = eintrag.getBildView();
				
			File anzeigebild = new  File(root.getAbsolutePath() + "/mnt/sdcard/FilmBilder/" + film.getStrichcode() + ".jpg"); 
		    if(anzeigebild.exists())
		    	imageView.setImageBitmap(BitmapFactory.decodeFile(anzeigebild.getAbsolutePath()));
		         
		    
		    imageView.setOnTouchListener(new OnTouchListener() 
		    {
		        @Override
		        public boolean onTouch(View v, MotionEvent event) 
		        {

		                return false;
		        }
		    }); 

		    imageView.setOnLongClickListener(new OnLongClickListener() {

		        public boolean onLongClick(View v) {
		            // TODO Auto-generated method stub
		            EintragGewaehlt( (((eintrag) v.getParent().getParent().getParent().getParent())).getStrichcode());
		           
		           ;
		            return true;
		            }        
		        }); 
			layout.addView(eintrag);
		}
	
		}
		catch(Exception e)
		{
			String a = "";
		}



            
	}
```


----------



## dzim (25. Nov 2013)

Bevor ich mich an das eigentliche Thema mache, ein paar Anmerkungen vorab:

denglischer Code!? Ernsthaft?
Listen in einem LinearLayout!? Ernsthaft?

Das erste ist vielleicht Geschmackssache - ich persönlich empfinde es aber seit ich entwickle (immerhin mit Studium und so schon über 10 Jahre) extrem hässlich. Sorry, aber das ist da wirklich meine Meinung.

Ohne dein UI zu kennen hat ein reines LinearLayout - im Verlgeich zu einem ListView - zwei wesentliche Nachteile: Zum Einen muss es in einem ScrollView eingebettet werden, falls du zu viele Listeneinträge hast und zum Anderen musst du bedenken das ListViews und z.B. ArrayAdapter nur die Listeneinträge laden, die wirklich zu sehen sind!
Problem ist, dass du in deiner Variante immer alles lädst, die Operation zum Finden der Views nicht immer die schnellste ist und du alles auf dem Hauptthread machst.

Ich empfehle also, dass du dir zuerst mal Gedanken um einen ListView machst!
Auch das Laden des Bilds als File ist eher sub-optimal - verwende eine drawable-Resource!
*filterkriterium == "Name"* - ernsthaft? String-Vergleich mit ist-gleich!? Das ist eines der ersten Dinge die man lernt nicht zu machen, weil es potentiell nie erfüllt werden wird. == wird für primitive Datentypen *oder* für Objektreferenzen verwendet.

```
int a1 = 0;
int a2 = 0;
// (a1 == a2) --> true
String b1 = "test";
String b2 = "test";
// (b1 == b2) --> false - nicht die gleichen Objekte
// aber: b1.equals(b2) --> true - gleicher Inhalt
// was funktioniert ist (b1 == b1) --> true - gleiches Objekt
b2 = b1;
// (b1 == b2) --> true, da beide jetzt intern auf das Selbe Objekt zeigen
```

Zu deinem eigentlichen Problem: Ein ProgressDialog als solches bringt dir nichts. Erst in einen SynchTast eingebettet wird er IMHO sinnvoll. Problem ist aber, dass hier nur die Vorher-/nachher-Operation auf dem Hauptthread laufen, ansonsten aber ist es ein Non-UI-Thread von dem aus du deine Oberfläche ohne viele view.post(Runnable) (was es im Endeffekt unübersichtlicht) nicht updatebar.

Fazit: Vergiss den Fortschrittdialog und ersetze das LinearLayout durch einen ListView (und wenn du das LinearLayout in einem ScollView hast, entferne ihn auch) und implementiere einen ArrayAdapter!

Tutorial: Android ListView - Tutorial

Viel Erfolg!


----------



## mysterix (25. Nov 2013)

dzim hat gesagt.:


> Bevor ich mich an das eigentliche Thema mache, ein paar Anmerkungen vorab:
> 
> denglischer Code!? Ernsthaft?
> Listen in einem LinearLayout!? Ernsthaft?
> ...



Hi,

vielen Dank für die ausführliche Antwort. 

Ich komme von C# und da vergleichen wir auch Strings mit "==". Mir ist völlig klar, dass man es mit equals macht, da ich auch des öfteren drauf rein gefallen bin. Leider vergesse ich das noch sehr häufig wenn ich gerade im Schreibfluss bin. Danke!

Die anderen Sachen werde ich heute im laufe des Tages ausprobieren und mich mit evtl. Rückfragen oder einem akzeptablen Ergebnis zurückmelden! Also vielen Dank schonmal 


Gruß,
MysteriX


----------



## dzim (25. Nov 2013)

Ok. Es seih dir verziehen! ;-)
Viel Erfolg beim einarbeiten in Java.

Btw: Warum nutzt du dann nicht Xamarin für Android - dann kannste weiter mit C# arbeiten, mal von den XML-Resourcen abgesehen, so weit ich weiß...


----------



## mysterix (25. Nov 2013)

dzim hat gesagt.:


> Ok. Es seih dir verziehen! ;-)
> Viel Erfolg beim einarbeiten in Java.
> 
> Btw: Warum nutzt du dann nicht Xamarin für Android - dann kannste weiter mit C# arbeiten, mal von den XML-Resourcen abgesehen, so weit ich weiß...



Ich hab sogar ne echte Lizens für Xamarin von meiner Firma, aber die brauchen immer so ewig um nach zu ziehen, wenns darum geht, dass Java Neuerungen einbringt. Und die Community ist nicht annähernd ausreichend meines Erachtens nach. Auch da kann / muss(?) man die Oberfläche in XML-Format hinwerfen. Also ich mach mich gleich ran an die Arbeit


----------



## dzim (25. Nov 2013)

Gib Java eine Chance, auch wenn Google leider Java in der Version 1.6 belässt... (Wobei ich denke, dass das Absicht ist! Die wollen das bestimmt irgendwann mal ersetzen.)
Wenn man sich eingearbeitet hat, auch wenn das schon gut 6 Monate dauern mag, kann man echt schnell Apps bauen.

Ich hab die erste ernsthafte App vor etwas weniger als einem Jahr angefangen und auch wenn der Code mitunter noch zu wünschen übrig lässt (ich hab vieles allein und unter Zeitdruck erstellen müsse... Kannst dir sicher vorstellen, was dann passiert...), ist die App mittlerweile durchaus in Ordnung vom Funktionsumfang her. Das UI-Design - da kann man sich streiten - ich mag dunkle Designs und keine flachen Knöpfe 

Wenn du es mal anschauen willst: einfach nach *cnlab SpeedTest* im Play Store suchen...


----------

