ProgressDialog wird nicht angezeigt

  • Antworten:8
Mathias Dorn
  • Forum-Beiträge: 19

08.08.2011, 17:34:46 via Website

Hi ich habe folgendes Problem.

Ich will Daten via PHP-Webservice in eine MySQL DB eintragen --> funktioniert bereits
damit ich den User anzeigen will, das der Upload läuft will ich wärend des Uploades ein ProgressDialog laufen lassen

--> ProgressDialog Start
-->lokale SQL DB auslesen und sequentiell die Daten via HTTP-Post an PHP schicken(klappt auch)
-->ProgressDialog Ende

wenn ich dies allerdings in der Reihenfolge abarbeiten will, wird der ProgressDialog garnicht erst angezeigt
(ein Test ohne Upload zeigte das der ProgressDialog eigentlich angezeigt wird)

mein code sieht in etwa so aus

1progress = ProgressDialog.show(activity, "bitte warten", "upload läuft", false, false);
2DatabaseClass.uploadData(mainActivity.databasehelper);
3progress.dismiss();

wär für Anregungen dankbar, wo der Fehler liegen könnte

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

08.08.2011, 19:21:03 via Website

Mal den Log Cat durchgeschaut ob dort Exceptions zu sehen sind?

Antworten
Ansgar M
  • Forum-Beiträge: 1.544

08.08.2011, 19:46:27 via Website

Wird für den Upload ein neuer Thread gestartet?
Lg Ansgar

Antworten
Mathias Dorn
  • Forum-Beiträge: 19

09.08.2011, 00:40:58 via Website

ja ... im log cat kommen keine exceptions

.

ok hier der code

1db = databasehelper.getWritableDatabase();
2
3 Cursor cursor = db.query(false, // distinct
4 TABELLEN_NAME, // tables
5 null, // columns
6 null, // where
7 null, // selectionArgs
8 null, // groupBy
9 null, // having
10 "_id DESC", // orderBy
11 null // limit
12 );
13
14 cursor.moveToFirst();
15
16 if(cursor != null){
17 if (cursor.isFirst()){
18 int i=0;
19 do{
20 i++;
21 Log.w("--------Datensatz - Upload--------", String.valueOf(i));
22
23 String Datum = cursor.getString(cursor.getColumnIndex(DATE_COLUMN));
24 String Zeit = cursor.getString(cursor.getColumnIndex(TIME_COLUMN));
25 String PName = cursor.getString(cursor.getColumnIndex(PROVIDERNAME_COLUMN));
26 Integer PId = cursor.getInt(cursor.getColumnIndex(PROVIDERID_COLUMN));
27 Integer CId = cursor.getInt(cursor.getColumnIndex(CID_COLUMN));
28 Double Longi = cursor.getDouble(cursor.getColumnIndex(LONGITUDE_COLUMN));
29 Double Lati = cursor.getDouble(cursor.getColumnIndex(LATITUDE_COLUMN));
30 String Weather = cursor.getString(cursor.getColumnIndex(WEATHER_COLUMN));
31
32// connectToServer.heimPc(Datum, Zeit, PName, PId, CId, Longi, Lati, Weather);
33
34 uploadActivity.uploadToPhpWebservice(Datum, Zeit, PName, PId.toString(), CId.toString(), Longi.toString(), Lati.toString());
35
36 } while(cursor.moveToNext());
37// uploadActivity.uploadFertig();
38 } else{
39 Log.w("cursor", "not 1st");
40 }
41 }
42 }
und im uploadActivity,uploadToPHPWebservice

1//http post
2 try{
3 HttpClient httpclient = new DefaultHttpClient();
4
5 HttpPost httppost = new HttpPost("adresse.php");
6 httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
7
8 HttpResponse response = httpclient.execute(httppost);
9
10 HttpEntity entity = response.getEntity();
11
12 is = entity.getContent();
13 }catch(Exception e){
14 Log.e("log_tag", "Error in http connection "+e.toString());
15 }

— geändert am 09.08.2011, 01:24:35

Antworten
Ansgar M
  • Forum-Beiträge: 1.544

09.08.2011, 01:04:11 via App

Also wird der Dialog scheinbar nicht angezeigt?
Lg Ansgar

Antworten
Mathias Dorn
  • Forum-Beiträge: 19

09.08.2011, 01:25:05 via Website

ja die progressdialog ist nicht sichtbar ... das is ein problem

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

09.08.2011, 06:56:35 via App

Wo genau ist der Thread? Stehen die Zeilen aus Deinem ersten Post in dessen run()? Der ProgressDialog muss meines Erachtens im UI Thread angelegt werden und der Datenbank Call im "zweiten" Thread laufen.

Ich habe das noch nie wie Du mit den Convinience Static Methoden gemacht. Ich erzwinge mit showDialog einen onCreateDialog, starte den Thread und in dessen run kommt der DB Call gefolgt von dem dismissDialog. Im onCreateDialog werden nur die Parameter des PD gesetzt.

Beispiel:

1private final Handler handler = new Handler();
2private ProgressDialog progressDialog;
3final Runnable runnable = new Runnable() {
4
5 @Override
6 public void run() {
7 if (progressDialog != null) {
8 dismissDialog(1);
9 progressDialog = null;
10 }
11 }
12};
13
14
15// z.B. im onOptionsItemSelected()
16showDialog(1);
17new Thread(new Runnable() {
18
19 @Override
20 public void run() {
21 process();
22 handler.post(runnable);
23 }
24} ).start();
25
26
27@Override
28protected Dialog onCreateDialog(final int id) {
29 if (id == 1) {
30 progressDialog = new ProgressDialog(this);
31 progressDialog.setCancelable(false);
32 progressDialog.setMessage("Message");
33 progressDialog.setProgress(0);
34 progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
35 progressDialog.setTitle("Title");
36 return progressDialog;
37 }
38}
39
40
41private void process() {
42 //Hier die eigentliche Aktivität des Threads
43}

— geändert am 09.08.2011, 08:25:08

Antworten
Mathias Dorn
  • Forum-Beiträge: 19

09.08.2011, 12:12:01 via Website

Vielen Dank für eure Tip´s hab es nun am laufen.

1progress = ProgressDialog.show( activity, "Bitte warten ...", "Upload läuft", true, false);
2 new Thread(){
3 public void run(){
4 DatabaseClass.uploadData(mainActivity.databasehelper);
5 progress.dismiss();
6 }
7 }.start();

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

09.08.2011, 12:19:59 via Website

Noch eine Anmerkung sei erlaubt:

Obwohl man es so in fast allen Beispielen sieht würde ich den progress.dismiss() aus der run() Methode rausnehmen und statt dessen wiederum im UI Thread ablaufen lassen. Das scheint derzeit so zu funktionieren - ich halte das aber für falsch. Ist eigentlich auch sofort erkennbar. Der ProgressDialog wird in Deinem Code außerhalb des neuen Threads gestartet aber innerhalb des neuen Threads beendet.

Im Thread würde ich statt dessen über einen Handler ein Runnable im UI Thread starten und dort würde der Dialog erst weggeworfen.

Nur meine 0.02 EUR.

Antworten