Android Öffnen eines ProgressDialogs

alex1511

Mitglied
Hallo zusammen,

ich habe ein kleines Problem damit einen ProgressDialog zu öffnen.
Ich schreibe zur Zeit eine App zur Inventarisierung von Firmenhardware. Hierbei habe ich eine Reihe von Listen (Adressbuch, Bezeichnerlisten etc.), die ich gerne Lokal in einer SQLite-Datenbank speichern möchte. Diese Listen möchten ich gerne, sofern der User es wünscht, per Kopfdruck mit der Datenbank synchronisieren. Die Synchronisierung an sich funktioniert gut, allerdings möchte ich gerne während der Synchroniserung einen ProgressDialog öffnen, sodass der User ein gewisses Feedback bekommt und weiß, dass da jetzt gerade im Hintergrund irgendwas passiert...
Dieser Dialog bereitet mir etwas Kopfzerbrechen.

hier kommt der Code:

Java:
public void activitySetting() {

    radioButtonNo = ((RadioButton) this.findViewById(R.id.radioButtonOfflineModeNo));
    radioButtonYes = ((RadioButton) this.findViewById(R.id.radioButtonOfflineModeYes));
    checkBoxAddressbook = ((CheckBox) this.findViewById(R.id.checkBoxAddressbook));
    checkBoxNotebook = ((CheckBox) this.findViewById(R.id.checkBoxNotebook));
    checkBoxMonitor = ((CheckBox) this.findViewById(R.id.checkBoxMonitor));
    checkBoxPc = ((CheckBox) this.findViewById(R.id.checkBoxPc));
    checkBoxPrinter = ((CheckBox) this.findViewById(R.id.checkBoxPrinter));
    buttonSave = ((Button) this.findViewById(R.id.buttonSave));
    buttonSave.setBackgroundColor(Color.DKGRAY);
    buttonSave.setTextColor(Color.WHITE);

    buttonSave.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {

            final Boolean workInProgress = true;
            c1 = getApplicationContext();
            db = new DBHandler(c1);
            //check what is marked

            boolean activateOffline = (radioButtonNo.isChecked()) ? false : true;
            //get marked checkboxe

            if (checkBoxAddressbook.isChecked()) {
                ProgressDialog pd = showAndDismissDialog(true, null);
                List<Person> result = HttpConnector.getInstance(c1).getAdressbook(c1, "AddressbookPerson");
                db.deleteAddressbook();

                for (Person e : result) {
                    db.addPerson(e);
                }
                showAndDismissDialog(false, pd);
            } else if (checkBoxMonitor.isChecked()) {
                //start method for synchronizing the monitorlist
            } else if (checkBoxNotebook.isChecked()) {
                //start method for synchronizing the notebooklist
            } else if (checkBoxPrinter.isChecked()) {
                //start method for synchronizing the printerlist
            } else if (checkBoxPc.isChecked()) {
                //start method for synchronizing the pclist
            }
            db.close();
            c1 = null;
        }
    });
}

    public ProgressDialog showAndDismissDialog(boolean param, ProgressDialog dialog) {
//param = true means show - param = false means dismiss
        final boolean mode = param;
        final ProgressDialog pd;

        if (dialog == null) {
            pd = new ProgressDialog(Synchronize.this);
        } else {
            pd = dialog;
        }

        if (mode) {
            // Set progress dialog style spinner
            pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
            // Set the progress dialog background color
            pd.getWindow().setBackgroundDrawable(new ColorDrawable(Color.parseColor("#FFD4D9D0")));
            pd.setIndeterminate(false);
            // Set the progress dialog title and message
            pd.setTitle("Synchronisation wird durchgeführt");
            pd.setMessage("Adressbuch.........");
            // Finally, show the progress dialog
            pd.show();
            return pd;
        } else {
             pd.dismiss();
             return null;
        }
    }

Beim Öffnen meine Synchronize-View wird activateSetting() aufgerufen.
Hier habe ich nun die Möglichkeit diverse Checkboxen auszuwählen und zu sagen, welche Listen ich neu synchronisieren möchte. Da ich bisher noch mit der Addressliste beschäfigt sind, sind die anderen Fälle noch nicht fertig programmiert. Ich möchte den Dialog gerne öffnen, wenn die Synchronisierung beginnt, ihn während der Synchronisierung updaten - sodass der User weiß, welche Liste gerade synchronisiert wird und ihn anschließend wieder schließen.

Hoffe jemand kann mir helfen.

Danke,
Alex
 
Zuletzt bearbeitet von einem Moderator:

buggy84

Bekanntes Mitglied
Ich würde keinen Progress Dialog nehmen, sondern eine eigene Acticty schreiben. Das hat den Vorteil, dass Du Deinen Dislog genau Deinen Wünschen anpassen kannst.

Ich habe keine konkrete Frage gelsen, deshalb rate ich ins Blaue:
Deine neue Activity muss in einem anderen Thread laufen als Deine MainActivity. Eine Kommunikation zwischen Threads ist mit Handlern möglich. Das ist zwar am Anfang sehr mühsam und manchmal "von hinten durch die Brust ins Auge", und einige Entwickler mögen das nicht so, aber wenn man mal raus hat wie das geht, ist das simpler als alle anderen Verrenkunden, die man machen müsste, um Handler zu umgehen.
 

alex1511

Mitglied
Hey, tut mir leid, dass ich jetzt erst antworte. Ich hatte bis heute Urlaub und komme erst jetzt dazu an der App weiterzuarbeiten. Werde das mit der activity nun so händeln und versuchen den Callback mit einer Art Observer-Pattern abzufangen.
Danke für den Tipp
 

buggy84

Bekanntes Mitglied
Ja, das kann man auch mit Observer Pattern machen, fände ich jetzt aber ein bisschen zu overkill um einfach nur Stati anzuzeigen. Ich fände es gut, wenn Du Dein Ergebnis hier präsentieren würdest, das würde vielen sicher als gutes Beispiel dienen.
 

alex1511

Mitglied
wie geschrieben hänge ich immer noch an dem Punkt fest und komme nicht weiter. Ich habe nun einiges probiert. Sowohl beim Observer, als auch bei einem einfachen ProgressDialog, den ich mir mittels onPreExecute() vorm ausführen meines asyncTasks anzeigen lassen möchte und mit onPostExecute() anschließend wieder verschwinden lassen möchte, funktioniert nichts.

Ich vermute, dass das Problem in der asynchronen Klasse an sich liegt.

Java:
    private class AsyncGetAddressbook extends AsyncTask<String, Integer, List<Person>> {

        ProgressDialog pd;
        protected List<Person> execute(Context c1, String... deviceType) {

            List<Person> result = doInBackground(deviceType);
            return result;
        }

        protected void onPreExecute() {
            super.onPreExecute();
            pd = new ProgressDialog(context);
            pd.setMessage("loading");
            pd.show();
        }

        @Override
        protected List<Person> doInBackground(String... deviceType) {

            String userPassword = "abc" + ":" + "123";
            byte[] test = userPassword.getBytes();
            String encoding = new String(Base64.encodeBase64(test));
            URL url;
            StringBuilder content = new StringBuilder();
            try {
                url = new URL(deviceType[0]);
                URLConnection con = url.openConnection();
                con.setRequestProperty("Authorization", "Basic " + encoding);
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(con.getInputStream()));
                String line;
//                Log.d("AddressBook",bufferedReader.readLine() );
                while ((line = bufferedReader.readLine()) != null) {
                    content.append(line + "\n");
                }
                bufferedReader.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return mapAndSort(content.toString());
        }

        public List<Person> mapAndSort(String input) {
            List<Person> personArrayList = new ArrayList<Person>();
            PersonComparator personComparator = new PersonComparator();

            try {

                JsonFactory factory = new JsonFactory();
                JsonParser parser = factory.createParser(input);
                Person person = new Person();

                while (!parser.isClosed()) {
                    JsonToken jsonToken = parser.nextToken();

                    if (JsonToken.FIELD_NAME.equals(jsonToken)) {
                        String fieldName = parser.getCurrentName();

                        parser.nextToken();
                        if ("FirstName".equals(fieldName)) {
                            person.setFirstName(parser.getValueAsString());
                        } else if ("LastName".equals(fieldName)) {
                            person.setLastName(parser.getValueAsString());
                        } else if ("OfficePhoneNumber".equals(fieldName)) {
                            person.setOfficePhoneNumber(parser.getValueAsString());
                            personArrayList.add(person);
                            person = new Person();
                        }
                    }
                }
                Collections.sort(personArrayList, personComparator);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return personArrayList;
        }

        @Override
        protected void onPostExecute(List<Person> persons) {
            super.onPostExecute(persons);

            pd.dismiss();
        }
    }
Zur Erklärung:

Ich lade mir ein Addressbuch aus einer Firmendatenbank. Dieses Addressbuch bekomme ich als ein langes JSON-Object zurückgeliefert, welches rund 1400 Einträge hat und jeweils 3 Attribute besitzt (Name, Vorname, TelNr).
Dieses parse ich, sortiere es nach Nachnamen und gebe es zurück. Nun will es mir einfach nicht gelingen, für die Zeit des Ladens einen Progress-Dialog anzeigen zu lassen und ich verzweifel so langsam :)

Sieht jemand den Fehler in meinem Code oder meiner Denkweise?

Lieber gruß, Alex
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W App deinstallieren per Button & Andere App Öffnen per Button Android & Cross-Platform Mobile Apps 24
V Android Fehlermeldung beim Öffnen von Eclipse nach Installation der Android Erweiterung Android & Cross-Platform Mobile Apps 4
L Feld eines Eingabeformulars automatisch mit UserID ausfüllen Android & Cross-Platform Mobile Apps 1
L Android Länge eines Musikordners Android & Cross-Platform Mobile Apps 7
C Zugriff auf die Position eines String- bzw Spinner-Arrays Android & Cross-Platform Mobile Apps 1
L Hintergrund eines Switch(Buttons) ändern Android & Cross-Platform Mobile Apps 3
Robat Android Umsetzung eines Spiels mit Minispielen Android & Cross-Platform Mobile Apps 5
antonbracke Android OpenGL - Element zum Zeigen eines .obj Models Android & Cross-Platform Mobile Apps 2
M [Android] Wie erstellt man eine Verknüpfung eines Ordners? Android & Cross-Platform Mobile Apps 7
H Frage bei erstellen eines Projectes Android & Cross-Platform Mobile Apps 3
M Inhalt eines Eingabefeldes an einen Server senden? Android & Cross-Platform Mobile Apps 9
B Überlagern eines Layouts Android & Cross-Platform Mobile Apps 6
A Fehler beim Starten eines Intents - alles in einer Klasse funktioniert... Android & Cross-Platform Mobile Apps 4
T Android Ergebnis eines XML+XSLT "transform" in eine HTML - Datei schreiben (Android) Android & Cross-Platform Mobile Apps 2
Bastifantasti Lagesensor eines Handys ansprechen? Android & Cross-Platform Mobile Apps 48
A Problem beim Subtrahieren eines Double von einem Double Android & Cross-Platform Mobile Apps 5
C Woche eines Jahres rausfinden Android & Cross-Platform Mobile Apps 2

Ähnliche Java Themen

Neue Themen


Oben