2017-04-15 189 views
0

我嘗試在點擊按鈕時創建一個進度條。進度條只有在處理其他所有內容後纔可見。runOnUiThread調用後不會立即執行

MainActivity.this.runOnUiThread(new Runnable(){ 
      @Override 
      public void run() { 
       progressBar.setVisibility(View.VISIBLE); 
      } }); 

我可以強制UI線程加入或類似的東西嗎?

編輯:完整的onClick代碼

public void onClick(View view) { 
    if (view == etLocation){ 
     etLocation.setText(""); 

    } 
    if (view == btnGo){ 

     //progressBar.setVisibility(View.VISIBLE); 
     MainActivity.this.runOnUiThread(new Runnable(){ 
      @Override 
      public void run() { 
       progressBar.setVisibility(View.VISIBLE); 
      } }); 

     Thread buttonpress = new Thread(new Runnable() { 
      public void run() 
      { 
       buttonGo(); 
      } 
     }); 


     buttonpress.run(); 


    } 
    if (view == datePicker){ 
     new DatePickerDialog(MainActivity.this, date, myCalendar 
       .get(Calendar.YEAR), myCalendar.get(Calendar.MONTH), 
       myCalendar.get(Calendar.DAY_OF_MONTH)).show(); 
    } 
} 
+0

爲什麼?只是簡單地打電話給setvisibility –

+0

「在所有其他事情處理完成後」是什麼意思? 「我可以強制UI線程加入或類似的東西嗎?」 - 沒有。當主應用程序線程得到控制時,你的'Runnable'應該運行。如果你的'Runnable'不是*正在運行,最有可能的原因是你正在綁定你的主應用程序線程。 – CommonsWare

+0

不起作用。我首先執行其他代碼。我希望進度條顯示它被調用的確切時刻。 –

回答

0

UI線程是有意異步的。應用層的工作是告訴UI線程要做什麼不要當去做。

如果您的應用程序邏輯依賴於UI更新,那麼您應該認爲您的應用程序邏輯無論如何都要緊密耦合。

+0

我希望在加載時顯示進度條。所以我在按鈕被預設的那一刻開始。我不知道我該如何處理這個不同的問題。 –

+0

好吧,讓我們考慮你強制顯示你的下載欄(但我們這樣做),你的表現會下降的小元素。形成一個非常小的文件,要求顯示進度條並在完成後要求將其隱藏起來實際上更快。您的用戶界面可能正忙於其他繪圖事件,直到下載完成。在這種情況下,UI將被要求更新屏幕,並且它看到「這裏實際上沒有新東西」。 – Ray

+0

此外,屏幕在重繪(50到60Hz顯示)之間有延遲,所以在繪製幀之間大約有20ms的延遲。所以如果更新屏幕的時間不是相同的納秒,請不要擔心。屏幕不會更新爲另一個19.999 ... ms 異步執行事情已經足夠好了 - 不必擔心「請更新UI」和UI的實際呈現之間的小延遲。 – Ray

0

runOnUiThread是異步的。通過您的代碼看,我看到一個簡單的辦法把它太:

//progressBar.setVisibility(View.VISIBLE); 


    Thread buttonpress = new Thread(new Runnable() { 
     public void run() 
     { 
      buttonGo(); 
     } 
    }); 
    //Move runOnUiThread down. The thread above will not start doing its thing until you tell it to run 
    MainActivity.this.runOnUiThread(new Runnable(){ 
     @Override 
     public void run() { 
      progressBar.setVisibility(View.VISIBLE); 
      buttonpress.run();//TO HERE. Now the progressbar will be initialized, THEN the thread will start 
     } }); 


    //buttonpress.run(); MOVE THIS 

我基本上做的是移動runOnUiThread下來,所以它可以訪問ButtonPress線程。

然後,在progressBar可見之後,您將運行該線程。

+0

它不工作,我不知道爲什麼... –

+0

你試過我建議的嗎?有沒有錯誤? – Zoe