ProgressDialog wird nicht angezeigt verschwindet gleich wieder

  • Antworten:4
  • Bentwortet
Phil
  • Forum-Beiträge: 40

22.12.2010, 17:26:46 via Website

Hallo,
ich habe zu diesem Thema schon ein wenig was im Forum gefunden, aber leider noch keine für mich brauchbare Lösung. Ich möchte gerne einen HTTP-Request starten und während der Benutzer warten muss diesen netten "Loading-Dialog" anzeigen.

Dazu habe ich jetzt folgenden Quelltext verwendet:

1private String getURL(String strURL) {
2 ProgressDialog dialog = ProgressDialog.show(this, "","Daten werden geladen...", true);
3 String result = "";
4 DefaultHttpClient httpclient = new DefaultHttpClient();
5
6
7 HttpGet httpget = new HttpGet(strURL);
8
9 HttpResponse response;
10 try {
11 response = httpclient.execute(httpget);
12 ByteArrayOutputStream out = new ByteArrayOutputStream();
13 response.getEntity().writeTo(out);
14 out.close();
15 result = out.toString();
16 } catch (Exception ex) {
17 }
18 dialog.dismiss();
19 return result;
20 }

Leider wird der Dialog nicht angezeigt, bzw. wenn ich das
1dismiss()
weglasse, bleibt der Dialog sichtbar.
Ich habe irgendwo hier im Forum mal etwas gelesen das man das mit handlern lösen soll / kann. Die Frage die sich mir nun stellt, welche Handler hätte ich denn hier zur verfügung?

Wäre echt klasse, wenn ich dazu ein paar nützliche Tipps (außer google.de) bekommen würde.

MfG
Phil

Antworten
Gelöschter Account
  • Forum-Beiträge: 294

23.12.2010, 15:16:59 via Website

Das sieht ganz grob so aus. Ist größtenteils mit der Hand zusammengestellt - kann also Tippfehler enthalten. Der ganze obere Block enthält Instanzvariablen und Methoden. Der eigentliche Aufruf ist ganz unten. Den packst Du dorthin wo er aufgerufen wird (Menu, Click, ...). Die Methode onPrepareDialog ist wichtig da Android Dialoge recycled. Du würdest ohne diese Methode ab dem zweiten Durchlauf mit dem 100% des ersten Durchlaufs starten. Die 9998 ist willkürlcih gewählt. Ich habe diese üblicherweise mit "public static final" Konstanten an zentraler Stelle definiert.

1private final Handler handler = new Handler();
2private ProgressDialog progressDialog;
3
4@Override
5protected Dialog onCreateDialog(int id) {
6 if (id == 9998) {
7 progressDialog = new ProgressDialog(DeineKlasse.this);
8 progressDialog.setCancelable(false);
9 progressDialog.setMessage(...);
10 progressDialog.setProgress(0);
11 progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
12 progressDialog.setTitle(...);
13 return progressDialog;
14 }
15
16 return super.onCreateDialog(id);
17}
18
19@Override
20public void onPrepareDialog(int id, Dialog dialog) {
21 super.onPrepareDialog(id, dialog);
22
23 switch (id) {
24 case 9998:
25 ProgressDialog progressDialog = (ProgressDialog) dialog;
26 progressDialog.setProgress(0);
27 break;
28 }
29}
30
31private void process() {
32 // Was auch immer laufen soll hier rein
33 progressDialog.setProgress(50);
34 // Die zweite Hälfte ...
35 progressDialog.setProgress(100);
36}
37
38private void refresh() {
39 // Soll nach Ablauf irgendetwas neu gezeichnet werden? Hier rein.
40}
41
42final Runnable runnable = new Runnable() {
43 public void run() {
44 refresh();
45 }
46};
47
48// Hiermit wird alles gestartet
49showDialog(9998);
50new Thread(new Runnable() {
51 public void run() {
52 process();
53 dismissDialog(9998);
54 handler.post(runnable);
55 }
56}).start();

Gruß
Harald

Antworten
Phil
  • Forum-Beiträge: 40

25.12.2010, 17:33:28 via Website

Hallo,
L3322
danke für den Link, ich habe das ganze versucht, leider passiert wieder nicht das was ich haben möchte :/

Ich habe mir den Handler erstellt.
1public class meinProgramm Activity {
2 private ProgressDialog progressDialog;
3//...
4 public void onCreate(Bundle savedInstanceState) {
5 super.onCreate(savedInstanceState);
6 setContentView(R.layout.main);
7
8 progressDialog = new ProgressDialog(this);
9//...
10}
11private Handler handler = new Handler() {
12 @Override
13 public void handleMessage(Message msg) {
14 progressDialog.dismiss();
15 }
16 };
17//...
18private String getURL(String strURL) {
19 ProgressDialog dialog = ProgressDialog.show(this, "","Daten werden geladen...", true);
20
21 String result = "";
22 DefaultHttpClient httpclient = new DefaultHttpClient();
23 HttpGet httpget = new HttpGet(strURL);
24 HttpResponse response;
25
26 try {
27 response = httpclient.execute(httpget);
28 ByteArrayOutputStream out = new ByteArrayOutputStream();
29 response.getEntity().writeTo(out);
30 out.close();
31 result = out.toString();
32 } catch (Exception ex) {
33 }
34 handler.sendEmptyMessage(0);
35 return result;
36 }
37
38}

Nun rufe ich getURL auf. Die URL wird geladen und die Daten werden erfolgreich verarbeitet. Aber erst sobald die Daten verarbeitet wurden erscheint einmal kurz der Dialog und kurz danach verschwindet er wieder.

Was aber sinnvoll wäre ist: erst Dialog anzeigen, Daten laden und verarbeiten, Dialog ausblenden und NICHT Daten laden und verarbeiten, Dialog anzeigen und gleich wieder ausblenden.

Alternativ habe ich noch folgendes versucht:
[code]
public class meinProgramm Activity {
private ProgressDialog progressDialog;
private Activity me;
//..
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

me = this;

progressDialog = new ProgressDialog(me);
//...
private String getURL(String strURL) {
String result = "";
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet(strURL);
HttpResponse response;

try {
response = httpclient.execute(httpget);
ByteArrayOutputStream out = new ByteArrayOutputStream();
response.getEntity().writeTo(out);
out.close();
result = out.toString();
} catch (Exception ex) {
}
return result;
}

private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
progressDialog.dismiss();
}
};
}

//...
private void getDaten() {
progressDialog = ProgressDialog.show(me, "","Daten werden geladen...", true);
adapter.clear();
String result[] = getURL("http://meineURL.com/getDaten.php").split(";");
for(int i = 0; i < data.length-1; i++) {
String data[] = result[i].split("#");
String datum = data[0];
String zeit = data[1];
adapter.add(datum + " "+ zeit);
}
handler.sendEmptyMessage(0);
}

}
[/code]

Hierbei passiert folgendes:
Die Daten werden angefordert und geladen. Der Dialog erscheint kurz und verschwindet wieder.

Ich werde es nunmal mit Threads versuchen, vllt habe ich da ja ein wenig mehr glück, oder habe ich hier noch einen dummen Fehler gemacht?

Danke und Frohe Feiertage.
Phil

— geändert am 25.12.2010, 17:43:17

Antworten
Phil
  • Forum-Beiträge: 40

28.12.2010, 18:28:44 via Website

Hallo,
ich habe jetzt ein wneig mit Threads rumporibiert und habe eine Lösung gefunden.

Benutzt habe ich Threads und den vorher schon genannten Handler.

Danke euch.
Phil

Antworten