我在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);
}
});
}
答案 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);
}
});
}