2012-07-26 56 views
0
beginButton.setOnClickListener(new Button.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     PlayThread playThread = new PlayThread(); 
     Thread thread = new Thread(playThread); 

     thread.start(); 
    } 
}); 

public class PlayThread implements Runnable { 
    @Override 
    public void run() { 
     beginButton.setClickable(false); 
     pauseButton.setClickable(true); 
     messageBool = true; 
     int maxProgressBar = playProgressBar.getMax(); 
     int currentInt = playProgressBar.getProgress(); 

     for(; currentInt <= maxProgressBar; ++currentInt) 
     { 
      if(messageBool == false) 
      { 
       break; 
      } 
      playProgressBar.incrementProgressBy(1); 
      try { 
       Thread.sleep(400); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 

     if(currentInt > maxProgressBar) 
     { 
      playProgressBar.setProgress(0); 
      beginButton.setClickable(true); 
      pauseButton.setClickable(false); 
     } 
    } 
}; 

大家好。這個代碼有什麼問題嗎?我知道我們不能在其他線程中操作UI的控件,除了UI線程。但是這個代碼運行好吧。那麼有什麼問題或者我有什麼錯過? 在此先感謝!Android:在其他線程中操作UI控件,但是

+0

什麼是實際問題 – 2012-07-26 04:55:27

+0

他的問題是爲什麼它在非UI線程中工作正常? – aProgrammer 2012-07-26 05:03:05

回答

1

如果您不修改View以致需要在屏幕上重新繪製,那麼您很安全。 setClickable只會修改其屬性之一,例如,如果您是設置文本或修改ViewLayoutParams,將使View無效的操作,可怕的異常從錯誤的線程觸及...等將出現。

ProgressBar是線程安全的,可以從任何線程使用。

+0

謝謝你的回答。但我怎麼知道哪種視圖是線程安全的?或者按鈕或其他類型的操作是線程安全的? – 2012-07-26 05:43:50

+0

@ ZhaoRocky如果我沒有弄錯,'ProgressBar'是唯一可以在每個線程中使用的'View'。關於屬性,沒有一個規則,關鍵是不要使'View'無效(如果您查看該特定視圖的源代碼,您會看到設置哪個屬性會導致'View'無效)。無論如何,你不應該這樣做,例如,在你的代碼中,唯一需要在'run'方法中的部分是帶'Thread.sleep()'的'for'循環。只要使用'Handler',就可以發佈結果了。 – Luksprog 2012-07-26 05:53:29

+0

非常感謝! – 2012-07-26 09:41:07

相關問題