2012-07-26 22 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

相关问题