1. pjanfred, 06.06.2012 #1
    pjanfred

    pjanfred Threadstarter Neuer Benutzer

    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

    du darfst deine UI nicht im thread verändern
     
  3. pjanfred, 06.06.2012 #3
    pjanfred

    pjanfred Threadstarter Neuer Benutzer

    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

    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

    okay, stimmt garnichts. Aber wie bekomme ich meine Idee nun realisiert?
     
  6. swordi, 06.06.2012 #6
    swordi

    swordi Gewerbliches Mitglied

    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

    oder mal Code und Logcat posten
     
  8. pjanfred, 06.06.2012 #8
    pjanfred

    pjanfred Threadstarter Neuer Benutzer

    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

    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.