0

我对 Java 中的 Thread 有疑问。我想在单击按钮(bt1)时将背景设置为图片,然后等待5秒并将同一按钮的背景设置为图片。问题是第一张图片从未设置过。程序只需等待 5 秒并设置图片 2。这是代码。

bt1.setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View v) {
          bt1.setBackgroundResource(R.drawable.picture);
              try
                 {
                   Thread.sleep(5000);
              }
              catch( InterruptedException e )
              {
                  e.printStackTrace();
              }
          bt1.setBackgroundResource(R.drawable.pic);
        }
    });

}
4

7 回答 7

9

永远不要让用户界面线程休眠!

于 2013-09-11T14:56:08.527 回答
8

问题是您正在处理对 GUI 事件做出反应的线程中睡觉。当该线程休眠时,GUI 已死。您需要做一些其他事情来获得 5 秒的延迟,例如使用 Timer 在 5 秒内创建一个新事件。

于 2013-09-11T14:57:55.840 回答
3

试试这个:

public void onClick(View v) {
    bt1.setBackgroundResource(R.drawable.picture); 
    new Handler().postDelayed(new Runnable() {

            @Override
            public void run() {
                bt1.setBackgroundResource(R.drawable.picture);

            }
        }, 5000);
}
于 2013-09-11T14:58:18.863 回答
2

这是因为您在主 UI 线程上运行所有内容。切勿在 UI 线程中使用睡眠。

这是给你的代码。

public void onClick(View v) {
            bt1.setBackgroundResource(R.drawable.picture);
            Thread thread = new Thread()
            {
                @Override
                public void run() {
                    try {
                            Thread.sleep(5000);
                            runOnUiThread(new Runnable(){public void run()
                            {
                                bt1.setBackgroundResource(R.drawable.pic);
                            }});    

                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            };

            thread.start();


        }
    });
于 2013-09-11T15:04:58.937 回答
0

使用倒计时

new CountDownTimer(5000, 1000) {

 public void onTick(long millisUntilFinished) {

 }

 public void onFinish() {
      bt1.setBackgroundResource(R.drawable.picture);

 }
}.start();
于 2013-09-11T15:03:59.820 回答
0

使用Handlder.PostDelayed(),并且永远不要在 UI Thread 中进行耗时的操作,例如 sleep、network、database...

于 2013-09-11T15:04:53.293 回答
0

为什么不使用调度程序?这是一个可能的实现

bt1.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {
      bt1.setBackgroundResource(R.drawable.picture);
         ScheduledExecutorService scheduler = Executors
            .newSingleThreadScheduledExecutor();
    scheduler.scheduleAtFixedRate(new Runnable() {
        public void run() {
             bt1.setBackgroundResource(R.drawable.pic);
        }
    }, 5, 60, TimeUnit.SECONDS);
      bt1.setBackgroundResource(R.drawable.pic);
    }
});

}

于 2013-09-11T15:20:45.300 回答