2015-09-16 3 views
0

J'essaie d'afficher un ProgressDialog pendant que je charge des données à partir d'une API. J'ai mis l'APIPost dans un fil, et à des fins de débogage, j'ai mis le fil en veille pendant 3 secondes en essayant de faire apparaître la boîte de dialogue. Toutefois, lorsque je démarre le thread, aucune boîte de dialogue n'apparaît et le thread d'interface utilisateur se bloque simplement. Est-ce que je manque quelque chose?ProgressDialog ne s'affiche pas lorsque thread est en cours d'exécution

final ProgressDialog dialog; 

    dialog = new ProgressDialog(MyClassName.this); 

    dialog.setTitle(""); 
    dialog.setMessage("Loading..."); 
    dialog.setCancelable(false); 

    Thread runner = new Thread(){ 
     JSONObject jTemp; 
     @Override 
     public void run(){ 
      try { 
       synchronized(this){ 
        wait(3000); 
       } 
       getFarmProperties.postAPI(tempAddress); 

       do { 
        jTemp = getFarmProperties.getJSON(); 
       } while (jTemp == null); 
      } 
      catch(InterruptedException ex){ 
      } 

     } 
    }; 

    try { 
     runner.start(); 
     dialog.show(); 
     runner.join(); 
     dialog.dismiss(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
+0

Y a-t-il une raison pour laquelle vous n'utilisez pas un AsyncTask à la place? – ElliotM

+0

J'utilise un AsyncTask dans ma méthode postAPI. J'ai essayé de mettre cela dans un AsyncTask avec les mêmes résultats –

+0

D'où appelez-vous cela? 'runner.join()' provoque le thread en cours à attendre que le thread d'arrière-plan se termine. Si vous appelez cela sur le thread d'interface utilisateur, vous arrêtez effectivement votre interface utilisateur de la mise à jour jusqu'à ce que le thread d'arrière-plan soit terminé. – dhke

Répondre

0

blocs runner.join le thread d'interface utilisateur jusqu'à ce que coureur vient compléter la suite. Comme suggéré, utilisez plutôt AsyncTask.

0
runner.start(); 
dialog.show(); 
runner.join(); 
dialog.dismiss(); 

Cela commence essentiellement le fil, envoie une requête pour afficher la boîte de dialogue de progression, attend le fil à la fin et puis rejette la boîte de dialogue de progression.

Étant donné que la boîte de dialogue de progression est uniquement dessinée lorsque le thread d'interface utilisateur a la possibilité de traiter la file d'attente de messages, elle n'est jamais dessinée en premier lieu.

Soit utiliser AsyncTask et rejeter la boîte de dialogue dans onPostExecute() ou se débarrasser de la join() et de rejeter la boîte de dialogue de progression lorsque le fil de fond a fini d'utiliser runOnUIThread(). Je suggère d'utiliser AsyncTask car il fait toute la gestion pour vous, y compris les méthodes de rappel pratiques.