2015-09-16 98 views
0

我試圖在從API加載一些數據時顯示ProgressDialog。我將APIPost放到一個線程中,出於調試的目的,我一直讓線程休眠3秒,試圖讓對話框出現。但是,當我啓動線程時,不會出現對話框,並且UI線程只是掛起。我錯過了什麼嗎?ProgressDialog在線程運行時不顯示

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

是否有原因,而不是使用AsyncTask? – ElliotM

+0

我在我的postAPI方法中使用了AsyncTask。我試過把它放在一個AsyncTask中,結果相同 –

+0

你從哪裏調用這個? 'runner.join()'導致當前線程等待後臺線程終止。如果你在UI線程中調用它,你將有效地阻止你的UI更新,直到後臺線程完成。 – dhke

回答

0

runner.join阻止UI線程,直到跑步者最終完成。如建議使用AsyncTask代替。

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

這基本上啓動線程,發佈一個請求來顯示進度對話框,等待線程完成,然後關閉進度對話框。

由於只有在UI線程有機會處理消息隊列時才繪製進度對話框,因此從不會首先繪製進度對話框。

要麼使用AsyncTaskonPostExecute()關閉對話框或擺脫join()的,當後臺線程使用runOnUIThread()完成駁回進度對話框。我建議使用AsyncTask,因爲它爲您執行所有管理,包括方便的回調方法。