线程睡眠,不做

时间:2013-09-11 14:53:58

标签: java android multithreading sleep

我在Java中遇到Thread问题。我想点击按钮(bt1)将背景设置为图片,然后等待5秒并将相同按钮的背景设置为图片。问题是从未设置过第一张图片。程序只需等待5秒钟并设置picture2。这是代码。

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);
        }
    });

}

7 个答案:

答案 0 :(得分:9)

永远不要睡觉用户界面线程!

答案 1 :(得分:8)

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

答案 2 :(得分: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);
}

答案 3 :(得分:2)

因为您在主UI线程上运行所有内容。永远不要在UI线程中使用sleep。

这是给你的代码。

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();


        }
    });

答案 4 :(得分:0)

使用countdowntimer

new CountDownTimer(5000, 1000) {

 public void onTick(long millisUntilFinished) {

 }

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

 }
}.start();

答案 5 :(得分:0)

使用Handlder.PostDelayed(),永远不要在UI线程中执行耗时的操作,例如睡眠,网络,数据库......

答案 6 :(得分: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);
    }
});

}