2011-04-05 2 views
3

dans cette application, l'utilisateur se connecte et ses informations d'identification sont vérifiées par rapport à un serveur.Vous devez afficher l'écran de chargement pendant que l'application interroge le serveur

L'utilisateur peut attendre quelques secondes, selon la vitesse à laquelle le téléphone peut ouvrir une connexion de données, voire pas du tout. J'ai besoin de boîte de dialogue disant "veuillez attendre" ou "vérifier les informations d'identification" ou quelque chose de long ces lignes après que l'utilisateur clique.

Ordre visuel désiré: appuyez sur log in -> "Veuillez patienter" dialogue est montré dans ce même activité -> quand le résultat est à partir du serveur une nouvelle activité est chargée (ou erreur est renvoyée)

ordre visuel actuel: est chargé> nouvelle activité

- presse Connexion -> attend l'utilisateur que si l'application est gelée

J'essaie de faire ce thread avec AsyncTask mais je ne comprends pas tout de suite!

class Progressor extends AsyncTask<Void, Void, Void> { 

ProgressDialog dialog; 
    protected void onPreExecute(){ 
     dialog = ProgressDialog.show(Login.this, "Logging In", 
       "Verifying Credentials, Please wait...", true); 
    } 

Ensuite, dans ma méthode oncreate j'avais tout de l'autre logique comme utilisateur en cliquant sur le bouton et tout ça, mais je l'ai depuis déplacé que dans doInBackGround de la méthode AsyncTask fonction

/* When the Login Button is clicked: */ 
     Button loginButton = (Button) findViewById(R.id.loginButton); 
     loginButton.setOnClickListener(new OnClickListener() {    


      public void onClick(View v) { 

       Progressor showMe = new Progressor(); 
       showMe.onPreExecute(); 
       showMe.doInBackground(null); 
       showMe.onPostExecute(); 

et onPostExecute simplement rejette la boîte de dialogue

Pourquoi cela ne fonctionne-t-il pas et comment devrait-il être réorganisé? Quelle variable dois-je passer dans la fonction showMe.doInBackGround(), il est vide. Dans le débogage, il ne sort jamais ici

@Override 
    protected Void doInBackground(Void... arg0) { 

Répondre

2

Ce n'est pas la façon dont vous utilisez un AsyncTask, jetez un oeil à la documentation. Une fois que vous avez créé une nouvelle instance de votre tâche, il suffit d'appeler execute(), pas les méthodes individuelles:

Progressor showMe = new Progressor(); 
showMe.execute(); 
+0

Merci, cette précision l'a vraiment fait pour moi! – CQM

1

J'ai un code similaire au début de mon application je charge les paramètres actuels du serveur, il fonctionne pour moi avec:

public static ProgressDialog verlauf; 
public static String vmessage = ""; 
static Handler handler = new Handler();; 

public static void initialize_system(final Context ctx) 
    { 
     verlauf = ProgressDialog.show(ctx, "Starte FISforAndroid..", "synchronisiere Einstellungen",true,false); 
     new Thread(){ 
      @Override 
      public void run(){ 
       Looper.prepare(); 
       GlobalVars.table_def.initialize(); 
       vmessage = "erstelle Tabellen"; 
       handler.post(verlauf_message); 
       builded = sqldriver.create_tables(); 
       vmessage = "setze Systemkonstanten"; 
       handler.post(verlauf_message); 
       builded = setsystemvars(ctx); 
       vmessage = "synchronisiere Einstellungen"; 
       handler.post(verlauf_message); 
       builded = settings.sync_ini(); 
       builded = settings.set_ini(); 
       GlobalVars.system_initialized = builded; 
       switch(GlobalVars.init_flags.FLAG){ 
        case 0: 

         break; 
        case GlobalVars.init_flags.UPDATE: 
         //load the update 
         break; 
       } 
       verlauf.dismiss(); 
      } 
     }.start(); 
    } 
3

Ne pas appeler manuellement les méthodes onPreExecute/doInBackground d'une asyncTask; Il suffit d'appeler execute() dessus et il appellera toutes vos méthodes dans les bons endroits à partir des bons fils. Cela annule le but entier d'une tâche asynchrone consistant à appeler toutes ses méthodes de manière synchrone à partir du thread de l'interface utilisateur (ce que fait votre exemple de code).

+0

me devança: –

0

Vous devez appeler showMe.execute(), plutôt que directement appeler doInBackground ou onPreExecute etc.

Questions connexes