Problem mit ProgressBar

  • Antworten:8
  • Bentwortet
Sascha N.
  • Forum-Beiträge: 60

22.12.2011, 05:29:31 via Website

Hallo zusammen.

Also ich möchte wenn ich meine Daten aus dem Internet herunterlade und der SAX parser die daten ausliest das eine Progressbar angezeigt wird.

Problem ist aber wenn ich folgenden Code ausführe :

1public void refreshEvents() {
2 TextView tTitel = (TextView) this.findViewById(R.id.tMonat);
3 tTitel.setText(monthsArray[MonthSelect+1]+" "+Integer.toString(YearSelect) );
4 this.eventList = new Events();
5 ListAdapter listenAdapter = new EventItemAdapter(this, this.eventList.getEvents());
6 ListView meineListView = (ListView) findViewById(R.id.list);
7 meineListView.setAdapter(listenAdapter);
8
9 }
Stoppt alles auf dem Bildschirm. Also ich sollte aber auch dazu sagen das die funktion in einer onClick anweisung ist.

Also ist das ergebnis das solange die Aktion noch nicht abgearbeitet ist auch kein anderer Klick ausgeführt werden kann. Selbst die ProgressBar Friert ein.

Gibt es eine möglichkeit das die ProgressBar dennoch weiter rund Läuft ? oder welche möglichkeit habe ich noch ?
Möchte einfach das der Endbenutzer sich nicht wundert warum nichts passiert während die daten ausgelesen werden. In Google habe ich KEINEN eintrag gefunden der mir helfen konnte. Ich habe zwar was mit Threads gesehen aber da ich neuling bin ist das noch etwas hoch für mich. Ich hoffe es kann mir jemand sagen was ich machen kann.

gruss Sascha

— geändert am 22.12.2011, 05:30:21

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

22.12.2011, 08:17:30 via Website

Solche lang dauernden Aktionen MUSST du in Threads machen, weil Activities die nicht reagieren von Android entdeckt werden und ein Dialog aufpoppt, mit dem man sie beenden kann.

Alle Infos findest du hier:
http://developer.android.com/reference/android/os/AsyncTask.html
http://developer.android.com/guide/topics/fundamentals/processes-and-threads.html

In Android macht man Multi-Threading meist mit AsyncTask.

Antworten
Sascha N.
  • Forum-Beiträge: 60

22.12.2011, 08:32:42 via Website

Danke Rafael erstmal für deine Antwort.

ok. Also bisher war das auf meinem Handy nicht wirklich schlimm mit der wartezeit. Denn noch werden keine Grossen Datenmengen angezeigt.
Aber auf alle fälle wie du das beschreibst MUSS ich an Threads denken. Ich bin grade mal froh einigermassen zu verstehen wie das mit dem SAX und dem allgemeinen Aufbau funktioniert. an einen Thread wollte ich mich erst trauen wenn der rest einigermassen funktioniert.

Eigentlich dachte ich das ich ein Laden bild einblenden kann. aber dem ist wohl nicht so.

Habe es auch mit nem ProcessDialog versucht aber das wird erst gar nicht angezeigt. Da habe ich auch schon einige andere Foren beiträge gesehen das es an der OnClick geschichte liegt.

Also noch eine weitere Sache erlernen. Danke auf jedenfall für die Info. ob das dann alles einigermassen für mich umsetztbar ist werde ich dann sehen.

werde mich dann hier melden wenn ich diesen Punkt geschafft habe.

gruss Sascha

Antworten
Sascha N.
  • Forum-Beiträge: 60

23.12.2011, 06:13:55 via Website

Kann ich nur bestätigen. :) Habe es nun hin bekommen das ich eine ProgressBar habe (mit AsyncThread)

problem ist das im Emulator immer ein neuer AsyncThread auf gemacht wird. So weit klar. Wird der nicht gelöscht und bekomme ich dann nicht wenn ich z.b. bei 100 Threads angekommen bin dann Probleme mit dem Speicher des Gerätes ?

gruss Sascha

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

23.12.2011, 08:15:37 via Website

Sobald keine Referenzen mehr auf ein Objekt existieren, wird es automatisch (nach kurzer Zeit) entsorgt.
Wenn du also nicht grade eine Liste mit allen AsyncTasks im Speicher hältst, werden die automatisch verworfen.
Außerdem belegt eine Instanz eines Objekts selbst relativ wenig Speicher.
Kritischer sind große Datenmengen wie byte-Arrays mit Binärdaten usw.

Antworten
Sascha N.
  • Forum-Beiträge: 60

25.12.2011, 04:40:07 via Website

Nein alles was dort passiert ist das die Listview aus dem internet mit einer XML datei gefüllt wird. Aber wenn du sagst das die automatisch wieder gelöscht werden ist das ja auch in ordnung :)

Habe ich das eigentlich richtig begriffen das der AsyncThread auch permanent während der App im hintergrund laufen kann ?? das zum beispiel auf aktualisierungen überprüft wird ?? alle stunde oder so also eine Aktualisierungs XML herunterladen könnte um zu schauen ob was passiert ist und dann mit einem Signalton darauf hinweisen ?? oder sollte man da eher einen Service für verwenden ??

Antworten
Florian B.
  • Forum-Beiträge: 284

25.12.2011, 11:37:45 via Website

Prinzipiell ist das möglich, allerdings keine gute Idee, da der Thread dann permanent läuft und dabei natürlich auch Resourcen verbraucht. Außerdem sind AsyncTasks in der Regel eher für UI-nahe Aufgaben geeignet, die auch schnell wieder vorbei sind, beispielsweise um einen Datenbank-Cursor zu laden, oder Bilder nach zu laden.

Für das Nachladen von Daten im Hintergrund, die nicht sofort in der UI angezeigt werden sollen, eignet sich ein IntentService besser. Diesen kannst du dann über den AlarmManager regelmäßig starten lassen, z.B.: täglich, stündlich oder wie auch immer. Der Vorteil ist, dass so der Service vom System gestartet wird wenn er gebraucht wird, und nicht ständig läuft.

Beim AlarmManger gibt es aber ein paar Dinge zu beachte, so geht z.B. ein Alarm nach einem Reboot des Systems verloren und muss nach dem Neustart neu registriert werden. Dafür wiederum muss man auf einen Broadcast hören, der ein "android.intent.action.BOOT_COMPLETED" Intent verschickt. Und das wiederum funktioniert nur wenn die App im internen Speicher abgelegt ist. Liegt die App auf dem externen Speicher dann kann sie den Intent nicht empfangen.

Antworten
Sascha N.
  • Forum-Beiträge: 60

25.03.2013, 20:55:13 via Website

Schön etwas älter der Beitrag aber dennoch danke.

Werde mich dann bei Gelegehnheit damit befassen. Es ist schön das Man immer wieder Jemanden Findet der sich mit der Materie Besser auskennt :)

Immerhin bin ich einsteiger und man könnte auch sagen UMSTEIGER (Bisher PHP und Pascal programmiert und nun auch Android :)

Antworten