1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Anmeldevorgang visualisieren - ohne das die App stehen bleibt

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von pjanfred, 06.06.2012.

  1. pjanfred, 06.06.2012 #1
    pjanfred

    pjanfred Threadstarter Neuer Benutzer

    Beiträge:
    19
    Erhaltene Danke:
    0
    Registriert seit:
    04.06.2012
    Hallo alle zusammen,

    ich habe folgendes Problem:

    Um einem Benutzer beim anmelden an meine App zu realisieren dass etwas passiert starte ich zunächst einen ProgressDialog und anschließend einen Thread in welchem der Anmeldevorgang realisiert wird.

    Diesem Thread übergebe ich dabei die Instanz meiner Activity um nach einem erfolgreichen Login Vorgang eine syncronized Funktion meiner Activity aufrufen zu können und den ProgressDialog zu beenden. (bis hier hin funktioniert alles)

    Der anschließende Versuch einen AlertDialog in der syncronized Funktion anzuzeigen endet jedoch mit einer Exception, obwohl selbiger Quelltext beim Aufruf ohne den Umweg über den Thread funktioniert.

    Hat jemand eine Idee wo mein Denkfehler liegt oder wie man es eigendlich machen sollte?

    Gruß
    Jan
     
  2. swordi, 06.06.2012 #2
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    du darfst deine UI nicht im thread verändern
     
  3. pjanfred, 06.06.2012 #3
    pjanfred

    pjanfred Threadstarter Neuer Benutzer

    Beiträge:
    19
    Erhaltene Danke:
    0
    Registriert seit:
    04.06.2012
    okay, aber deshalb nutze ich ja eine synchronized Funktion. Hast du den eine andere Idee wie ich mein Vorhaben realisieren könnte?
     
  4. swordi, 06.06.2012 #4
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    was hat eine synchronized methode damit zu tun ?

    nochmal nachlesen was genau synchronized bedeutet
     
  5. pjanfred, 06.06.2012 #5
    pjanfred

    pjanfred Threadstarter Neuer Benutzer

    Beiträge:
    19
    Erhaltene Danke:
    0
    Registriert seit:
    04.06.2012
    okay, stimmt garnichts. Aber wie bekomme ich meine Idee nun realisiert?
     
  6. swordi, 06.06.2012 #6
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    du musst wieder in den UI thread kommen.

    geschickt ist, wenn du dir mal den asynctask ansiehst

    ansonsten gibts noch handler oder runonUIthread()
     
  7. Tom299, 06.06.2012 #7
    Tom299

    Tom299 Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    oder mal Code und Logcat posten
     
  8. pjanfred, 06.06.2012 #8
    pjanfred

    pjanfred Threadstarter Neuer Benutzer

    Beiträge:
    19
    Erhaltene Danke:
    0
    Registriert seit:
    04.06.2012
    Der folgende Code funktioniert erstmal, jedoch möchte ich Ihn halt jetzt noch dazu bringen, das er in der Lage ist in der Funktion loginFailed() eine Fehlermeldung anzuzeigen.

    Code:
    package de.xyz_do.tb_app;
    
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.app.Dialog;
    import android.app.ProgressDialog;
    import android.content.DialogInterface;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.Toast;
    
    
    public class TbAppActivity extends Activity {
        private ProgressDialog waitDialog;
        
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            this.setTitle("Meine App");
    
        }
        
        public void onClickEinloggen(View v)  {
              // Zugangsdaten auslesen auslesen
            EditText benutzername = (EditText) findViewById(R.id.editTextBenutzername);
            EditText passwort = (EditText) findViewById(R.id.editTextPasswort);
    
            // Logindaten übermitteln
            LoginThread loginThread = new LoginThread(this,benutzername.getText().toString(),passwort.getText().toString());
            loginThread.start();
            
            // WaitDialog starten
            waitDialog = ProgressDialog.show(TbAppActivity.this, "", "Anmelden...", true);
            waitDialog.show();
        }
        
        public void loginSuccessful() {
            waitDialog.dismiss();
            System.out.println(">>>loginSuccessful");
        }
        
        public void loginFailed() {
            waitDialog.dismiss();
            System.out.println(">>>loginFailed");
        }    
    }
    
    class LoginThread extends Thread {
        private String benutzername;
        private String passwort;
        private TbAppActivity tbAppActivity;
        
        public LoginThread(TbAppActivity tbAppActivity, String benutzername,  String passwort) {
            this.benutzername = benutzername;
            this.passwort = passwort;
            this.tbAppActivity = tbAppActivity;
        }
        
        public void run() {
            // API initialisieren
            TcApi api = new TcApi();
            
            // Anfrage stellen
            if (api.doLogin(this.benutzername,  this.passwort)) {    
                this.tbAppActivity.loginSuccessful();        
            } else {
                this.tbAppActivity.loginFailed();
            }
            
        }
      
      }
    
    
     
  9. pjanfred, 08.06.2012 #9
    pjanfred

    pjanfred Threadstarter Neuer Benutzer

    Beiträge:
    19
    Erhaltene Danke:
    0
    Registriert seit:
    04.06.2012
    Jedem der mal das gleiche Problem wie ich hat sei folgende Seite der Android Doku ans Herz gelegt:

    Processes and Threads | Android Developers

    Mit dem AsyncTask lässt sich mein vorhaben ohne weiteres realisieren.
     

Diese Seite empfehlen