Anzeigen der Daten dauert zu lange - Progressdialog?

mysterix

Mitglied
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

Java:
	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

Top Contributor
Bevor ich mich an das eigentliche Thema mache, ein paar Anmerkungen vorab:
  1. denglischer Code!? Ernsthaft?
  2. 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.
Java:
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

Mitglied
Bevor ich mich an das eigentliche Thema mache, ein paar Anmerkungen vorab:
  1. denglischer Code!? Ernsthaft?
  2. 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.
Java:
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!

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

Top Contributor
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

Mitglied
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

Top Contributor
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...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Android Daten speichern und anzeigen Android & Cross-Platform Mobile Apps 7
W Bilder und Videos anzeigen lassen mit Zoom- und Loop-Funktion Android & Cross-Platform Mobile Apps 5
W Android Kann keine ListView mehr in der MainActivtiy anzeigen, obwohl noch sehr viel Platz frei ist Android & Cross-Platform Mobile Apps 1
ruutaiokwu Android In einem Android-“Spinner”-Element GLEICHZEITIG Bild (links) UND Text (rechts) anzeigen Android & Cross-Platform Mobile Apps 0
J ImageView: Bilder in niedriger Grafik anzeigen lassen Android & Cross-Platform Mobile Apps 2
M ImageButton: Bild ausblenden und Text anzeigen Android & Cross-Platform Mobile Apps 2
E Android Naturkatastrophen auf App anzeigen Android & Cross-Platform Mobile Apps 1
L Dialog anzeigen wenn auf Button gedrückt wird. Android & Cross-Platform Mobile Apps 4
C Android Bei Text "Popup" anzeigen Android & Cross-Platform Mobile Apps 2
B Android App debugen auf Handy, Handy-Desktop auf PC anzeigen Android & Cross-Platform Mobile Apps 1
J (Android) Bild(er) anzeigen lassen Android & Cross-Platform Mobile Apps 0
B Android In einem View der ersten Activity zweite anzeigen Android & Cross-Platform Mobile Apps 2
V PopUp in gleicher View anzeigen Android & Cross-Platform Mobile Apps 1
J Verschiedene xml layouts in relativlayout anzeigen lassen Android & Cross-Platform Mobile Apps 1
P Android Kontakt anzeigen lassen Android & Cross-Platform Mobile Apps 1
E Android Zwei Canvase übereinander legen und anzeigen Android & Cross-Platform Mobile Apps 7
G canvas in view anzeigen Android & Cross-Platform Mobile Apps 10
G Bilder als "Video" anzeigen Android & Cross-Platform Mobile Apps 3
S Android Fehler beim Anzeigen meines Apps auf Galaxy Tab Android & Cross-Platform Mobile Apps 4
J Schlicht und einfach Bild anzeigen ;) Android & Cross-Platform Mobile Apps 5
L HTML Seite anzeigen in Handy-Applikation Android & Cross-Platform Mobile Apps 5
P Bild anzeigen Android & Cross-Platform Mobile Apps 3
M Bilder nacheinander anzeigen Android & Cross-Platform Mobile Apps 6
M Firebase RealtimeDatabase - Daten aus Queries in CSV File speichern Android & Cross-Platform Mobile Apps 1
N XY-Plottet keine Daten obwohl Funktion ausgeführt wird Android & Cross-Platform Mobile Apps 4
N XY-Plot plottet keine Daten Android & Cross-Platform Mobile Apps 0
W Background Service Daten verarbeiten/Schleife ect. Android & Cross-Platform Mobile Apps 1
MiMa Daten vom Brustgurt bekommen? Android & Cross-Platform Mobile Apps 3
ruutaiokwu Android Daten von "Activity A" nach "Activity B" umleiten? Android & Cross-Platform Mobile Apps 13
P Daten bzw Objekte auf das Handy lokal speichern Android & Cross-Platform Mobile Apps 29
W Android Browser startet immer, bevor die Daten dafür geholt wurden Android & Cross-Platform Mobile Apps 15
J Android Server-Login Daten in der App sicherer hinterlegen? Android & Cross-Platform Mobile Apps 7
T Firestore Daten in Spinner Android & Cross-Platform Mobile Apps 0
L Android Daten von Webseite runterladen, die mit HTTP-Authentifizierung gesichert ist Android & Cross-Platform Mobile Apps 5
B Accelerometer daten umwandeln Android & Cross-Platform Mobile Apps 41
S Android Apk Daten auslesen Android & Cross-Platform Mobile Apps 6
G Android Daten in einer Datenbank speichern Android & Cross-Platform Mobile Apps 1
ATZENPOWER Android Probleme mit mobilen Daten via lte Android & Cross-Platform Mobile Apps 10
S Android Studio MySql Daten in Listview mit sub Item Android & Cross-Platform Mobile Apps 11
A Android Daten in der Cloud speichern (Google) Android & Cross-Platform Mobile Apps 1
K Unbekannte Menge von Daten (Strings oder Ints) an Activity übergeben Android & Cross-Platform Mobile Apps 0
K Android SQLite Query "WHERE _id in (X, Y, Z)" keine Daten Android & Cross-Platform Mobile Apps 6
K Android DialogFragment mit SimpleCursorAdapter: Auf Daten zugreifen? Android & Cross-Platform Mobile Apps 4
S Daten aus Android Gerät auslesen Android & Cross-Platform Mobile Apps 3
L Android Datei erstellen, Daten einspeichern und auslesen Android & Cross-Platform Mobile Apps 2
B Alle Daten gehen verloren, wenn die Displaysperre aktiviert wird? Android & Cross-Platform Mobile Apps 21
M Daten zwischen mehreren Activities Android & Cross-Platform Mobile Apps 2
M Daten zwischen Activities übergeben Android & Cross-Platform Mobile Apps 7
G Daten von einer Activity zur nächsten übergeben Android & Cross-Platform Mobile Apps 6
G Wie gebe ich dem DrawView die Daten mit? Android & Cross-Platform Mobile Apps 2
V App Daten in Java Applikation Android & Cross-Platform Mobile Apps 3
D Android Daten verwalten Android & Cross-Platform Mobile Apps 2
S Android binäre Daten zwischen Android und einem Java-Server Android & Cross-Platform Mobile Apps 5
M Android Von Smartphone auf Daten von Server zugreifen Android & Cross-Platform Mobile Apps 2
C Android Listen/Daten aus der SQLLite Datenbank darstellen Android & Cross-Platform Mobile Apps 2
L Android Einlesen und rausschreiben von Daten auf SD Android & Cross-Platform Mobile Apps 3
U Android Daten dauerhaft speichern? Android & Cross-Platform Mobile Apps 2
P Java ME benutzer daten speichern Android & Cross-Platform Mobile Apps 5
7 GPS-Daten auslesen auf Samsung SGH I900 Omnia Android & Cross-Platform Mobile Apps 3
X RMS - Will die Daten auf den PC kopieren Android & Cross-Platform Mobile Apps 3
B Daten in *.txt schreiben Android & Cross-Platform Mobile Apps 7
R Lesen und schreiben von Daten. Android & Cross-Platform Mobile Apps 2
K XDA Orbit: Auslesen der GPS Daten mit J2ME Android & Cross-Platform Mobile Apps 2
M Daten aus Jad-file auslesen Android & Cross-Platform Mobile Apps 2
O eingehende Daten speichern Android & Cross-Platform Mobile Apps 2

Ähnliche Java Themen

Neue Themen


Oben