2014-07-23 22 views
0

假设我的布局中有10个文本视图。我想在每次操作之间稍微延迟一个一个地改变背景。下面是一个示例代码:函数调用期间的UI块

public void test(){ 
    for (int i=0 ; i < 10 ; i++){ 
     myTextViews[i].setBackgroundResource(R.color.red); 
     try { 
      Thread.sleep(200); 
     } catch (InterruptedException e) { 

     } 
    } 
} 

问题是,在运行此函数期间,主线程块和背景不会改变。当程序完成运行功能时,它们会一起改变。如果我希望用户看到每个背景在正确的时间更改,然后下一个更改,我该怎么办?

回答

2

当您拨打Thread.sleep()时,您实际阻止的线程是UI线程,这就是您看到挂断的原因。你需要做的就是启动另一个线程来处理睡觉,或延迟,你想要的,然后利用runOnUiThread方法

试试这个:

public void test() { 
    new Thread(new Runnable() { 
     public void run() { 
      for(int i = 0; i < 10; i++) { 
       try { 
       Thread.sleep(200); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       //anything related to the UI must be done 
       //on the UI thread, not this thread we just created 

       runOnUiThread(new Runnable() { 
        public void run() { 
         myTextViews[i].setBackgroundResource(R.color.red); 
        } 
       }); 
      } 
     } 
    }).start(); 
} 
+1

感谢。但你忘了.start()和Thread定义的末尾;) – user2808671

+0

好的!编辑我的答案 – jaytj95

+0

而且Thread.Sleep必须在{try} {} catch {} 只需提一下第二种方法,我应该说runOnUiThread应该可以正常工作,但我使用Handler.Post将runnable发布到主循环器,凉。 – user2808671