Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Android中更改buttan的背景图像时延迟4秒_Android - Fatal编程技术网

如何在Android中更改buttan的背景图像时延迟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) {

我的示例应用程序中有两个按钮,我想以4秒的延迟一个接一个地更改按钮的背景图像,到目前为止,我已经开发了代码,您可以在下面看到它,但它在我的应用程序中睡眠,并且什么也不显示

请有人帮帮我,我可以这样做

   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
),因此不需要初始发布。