2

为什么首先执行 try 块,我希望先改变颜色,然后它应该休眠 5000 毫秒。我的意思是系统在颜色改变之前休眠。私人 OnClickListener CheckAnswer =新 OnClickListener() {

    public void onClick(View arg0) {
        // TODO Auto-generated method stub

        disableButtons();
        Button incoming=(Button) arg0;
        if(incoming.getText().toString().equals(Q.getAnswer()))
        {
            incoming.setBackgroundColor(Color.GREEN);
            correct++;
            score+=15;
        }
        else 
        {
            incoming.setBackgroundColor(Color.RED);
            wrong++;
            if(C1.getText().toString().equals(Q.getAnswer()))
                C1.setBackgroundColor(Color.GREEN);
            else if(C2.getText().toString().equals(Q.getAnswer()))
                C2.setBackgroundColor(Color.GREEN);
            else if(C3.getText().toString().equals(Q.getAnswer()))
                C3.setBackgroundColor(Color.GREEN);
            modifyScore();

        }
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        questionGenerator();
    }
};`
4

3 回答 3

9

我猜是因为视图的属性已更新,但屏幕重绘被困在你的睡眠后面。不要睡在主线程上。

而是在 Activity 的 onCreate 中创建一个 Handler 并将延迟的 Runnable 发布到它。

private Handler mHandler;
protected void onCreate(Bundle savedInstanceState) {
    mHandler = new Handler();
}
...
private OnClickListener CheckAnswer = new OnClickListener() {
     public void onClick(View view) {
       // fix up view
       mHandler.postDelayed(new Runnable() {
           @Override
           public void run() {
               questionGenerator();
           }
       }, 10000);
   }
}
于 2012-08-07T21:07:17.130 回答
2

您正在处理 GUI 的主线程(在 Swing 中称为EDT),它与执行更新的线程相同。所以顺序是:

  1. 设置新的背景颜色
  2. 睡眠 10 秒
  3. onClick返回
  4. 主线程有机会更新组件

我想你会发现不仅背景颜色没有改变,而且在完成之前你的整个 UI 似乎都被冻结Thread.sleep了。

您需要在另一个线程上完成主要工作(我不了解 Android,但在 Swing 中您可以使用SwingWorker),以便线程可以自由地执行其任务,包括更新组件。

于 2012-08-07T21:04:06.247 回答
0

首先,不要睡在你的 UI 线程中,你会得到一个强制关闭。其次,在 OnClickListener 结束之前,控件的实际(重新)绘制不会发生。

于 2012-08-07T21:06:13.117 回答