如何在Android中更改buttan的背景图像时延迟4秒
我的示例应用程序中有两个按钮,我想以4秒的延迟一个接一个地更改按钮的背景图像,到目前为止,我已经开发了代码,您可以在下面看到它,但它在我的应用程序中睡眠,并且什么也不显示 请有人帮帮我,我可以这样做如何在Android中更改buttan的背景图像时延迟4秒,android,Android,我的示例应用程序中有两个按钮,我想以4秒的延迟一个接一个地更改按钮的背景图像,到目前为止,我已经开发了代码,您可以在下面看到它,但它在我的应用程序中睡眠,并且什么也不显示 请有人帮帮我,我可以这样做 int m =0; int delay = 4; //Seconds while(m < 4) { // int i = (int) (Math.random() * num + 1); if(m==0) {
int m =0;
int delay = 4; //Seconds
while(m < 4)
{
// int i = (int) (Math.random() * num + 1);
if(m==0)
{
button1.postDelayed(new Runnable()
{
public void run()
{
// TODO Auto-generated method stub
button1.setBackgroundResource(R.drawable.buttonyellow);
m++;
}
}, 1000*delay);
}
else if(m==1)
{
button2.postDelayed(new Runnable()
{
public void run()
{
// TODO Auto-generated method stub
button2.setBackgroundResource(R.drawable.buttonyellow);
m++;
}
}, 1000*delay);
}
if(m==2)
{
button1.postDelayed(new Runnable()
{
public void run()
{
// TODO Auto-generated method stub
button1.setBackgroundResource(R.drawable.buttonblue);
m++;
}
}, 1000*delay);
}
else if(m==3)
{
button2.postDelayed(new Runnable()
{
public void run()
{
// TODO Auto-generated method stub
button2.setBackgroundResource(R.drawable.buttonblue);
m++;
}
}, 1000*delay);
}
}
intm=0;
int延迟=4//秒
而(m<4)
{
//int i=(int)(Math.random()*num+1);
如果(m==0)
{
按钮1.postDelayed(新的可运行()
{
公开募捐
{
//TODO自动生成的方法存根
button1.挫折资源(R.可绘制.buttonyellow);
m++;
}
},1000*延迟);
}
else如果(m==1)
{
按钮2.postDelayed(新的Runnable()
{
公开募捐
{
//TODO自动生成的方法存根
按钮2.收穗地资源(R.可提取。按钮黄色);
m++;
}
},1000*延迟);
}
如果(m==2)
{
按钮1.postDelayed(新的可运行()
{
公开募捐
{
//TODO自动生成的方法存根
button1.收穗地资源(R.可提取.buttonblue);
m++;
}
},1000*延迟);
}
else如果(m==3)
{
按钮2.postDelayed(新的Runnable()
{
公开募捐
{
//TODO自动生成的方法存根
按钮2.收穗地资源(R.可提取按钮蓝);
m++;
}
},1000*延迟);
}
}
postDelayed
不会延迟当前线程的执行,因此您的线程会反复发布m==0
案例
您可能希望您发布的Runnable调用一些方法,这些方法不仅设置背景和递增数字,而且还再次调用此逻辑(以选择要发布的新Runnable)
e、 g.(警告:未测试代码)
当然,这应该在UI线程上调用(如果它没有在UI线程上调用,则应该使用
post
或类似命令将其分派到UI线程)。postDelayed
不会延迟当前线程的执行,因此线程会反复发布m==0
案例
您可能希望您发布的Runnable调用一些方法,这些方法不仅设置背景和递增数字,而且还再次调用此逻辑(以选择要发布的新Runnable)
e、 g.(警告:未测试代码)
当然,这应该在UI线程上调用(如果没有在UI线程上调用,则应该使用
post
或类似命令将其分派到UI线程)。您的while循环导致UI线程等待这些操作完成。您最好的两个选择是在新线程中调用此选项:
new Runnable() {
@Override
public void run() {
//Your code
}
}.run();
或者将它们嵌入到链中:
button1.postDelayed(new Runnable()
{
public void run()
{
button1.setBackgroundResource(R.drawable.buttonyellow);
button2.postDelayed(new Runnable()
{
public void run()
{
button2.setBackgroundResource(R.drawable.buttonyellow);
button1.postDelayed(new Runnable()
{
public void run()
{
button1.setBackgroundResource(R.drawable.buttonblue);
button2.postDelayed(new Runnable()
{
public void run()
{
button2.setBackgroundResource(R.drawable.buttonblue);
}
}, 1000*delay);
}
}, 1000*delay);
}
}, 1000*delay);
}
}, 1000*delay);
while循环导致UI线程等待这些操作完成。您最好的两个选择是在新线程中调用此选项:
new Runnable() {
@Override
public void run() {
//Your code
}
}.run();
或者将它们嵌入到链中:
button1.postDelayed(new Runnable()
{
public void run()
{
button1.setBackgroundResource(R.drawable.buttonyellow);
button2.postDelayed(new Runnable()
{
public void run()
{
button2.setBackgroundResource(R.drawable.buttonyellow);
button1.postDelayed(new Runnable()
{
public void run()
{
button1.setBackgroundResource(R.drawable.buttonblue);
button2.postDelayed(new Runnable()
{
public void run()
{
button2.setBackgroundResource(R.drawable.buttonblue);
}
}, 1000*delay);
}
}, 1000*delay);
}
}, 1000*delay);
}
}, 1000*delay);
注意,这将一直持续到时间结束,或者当你的应用程序停止时
请注意,这将持续到时间结束或应用程序停止时。从研究postDelayed的工作原理开始。(另外,您的代码posted不会编译,因为m是本地的,用于匿名类)首先研究postDelayed是如何工作的。(另外,您的代码发布时不会编译,因为m是本地的,并且在匿名类中使用)请在我的代码中对if(m==0)进行适当的更改,我可以选择您的想法。不确定“适当的更改”是什么意思这里。有人能解释一下为什么这个响应两次被否决而没有任何评论吗?你的代码有点复杂,你让它在Runnable(它自己的线程)中运行,然后通过将它发布到buttons处理程序在ui线程上运行相同的Runnable。它没有在它自己的线程上运行。第一次,它在调用它的同一个线程上运行(可能是UI线程,否则将.run更改为post(而不是postDelayed)是合适的。但通常这种事情是响应UI事件(例如,
onStart
)而触发的,因此不需要初始post。请对if(m==0)进行适当的更改在我的代码中,我可以选择你的想法。我不确定你在这里所说的“适当的更改”是什么意思。有人能解释一下为什么这个响应被否决了两次,没有任何评论吗?你的代码有点复杂,你让它在Runnable(它自己的线程)中运行,然后通过将其发布到buttons处理程序,在ui线程上运行相同的runnable。它不在自己的线程上运行。第一次,它在调用它的同一线程上运行(可能是ui线程,否则是一个正在更改的.run to a post(而不是postDelayed)这是合适的。但通常这类事件是响应UI事件触发的(例如,onStart
),因此不需要初始发布。