2014-09-18 113 views
0

我正在制作简单的测验应用程序,现在有一个等待的问题。 当用户点击四个可能答案中的一个时,它应该变成橙色,两秒后变成红色或绿色(正确或错误答案)。这里是我的代码部分:Android:睡眠不适用于UI更改

public void clickButton(View v) { 
    changeButton(v, getResources().getDrawable(R.drawable.btn_orange)); 
    try { 
     //Thread.sleep(2000); 
     TimeUnit.SECONDS.sleep(2); 
    } catch (InterruptedException r) {} 

    changeButton(v, getResources().getDrawable(R.drawable.btn_red)); 
} 

我试过线程睡眠或睡眠TIMEUNIT,但在这两种情况下,该按钮将变为默认的白色“点击”阶段,两秒钟后,红色 - 完全跳过橙色部分。我检查了其他颜色,所以这些颜色xml文件中没有问题。问题可能在那个睡眠的某个地方,但我不知道我应该用什么来延迟红色,仍然是橙色。 thx咨询

+2

你不应该在主线程上睡觉,看看View.postDelayed() – panini 2014-09-18 22:04:48

+0

其实你不得在UI线程上睡觉。 – rupps 2014-09-18 22:13:28

回答

1

@panini是正确的,你不应该睡在主线程,而是使用另一个线程,尝试这样的事情,没有测试,所以我不知道它是否会工作,但是想法:

public void clickButton(final View v) { 
    changeButton(v, getResources().getDrawable(R.drawable.btn_orange)); 
    v.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      changeButton(v, getResources().getDrawable(R.drawable.btn_red)); 
     } 
    }, 2000); 


} 

也许你需要强制线程在UI中运行,无论如何尝试。如果这不起作用,你总是可以使用一个AsyncClass。希望能帮助到你。

1

将延迟Runnables张贴到UI线程的简单方法是将消息传递给UI线程的Handler

例如:

new Handler(Looper.getMainLooper()).postDelayed(new Runnable() { 
     @Override 
     public void run() { 
     changeButton(v, getResources().getDrawable(R.drawable.btn_orange)); 
     }}, 2000);