暂停内部循环(android)

时间:2014-05-02 19:16:47

标签: android for-loop sleep android-handler

今天我开始编写一个简单的android应用程序。想法是当按下按钮时调用方法“click(View v)”,在1秒后将TextField的背景改为随机颜色,让我们说30次

(长话短说:30种不同的背景颜色以1秒的间隔变化)。

这就是我所拥有的:

public void click(View v) {

    for(int i = 0; i >= 30; i++){       
       Random rand = new Random();
       final int red = rand.nextInt(255);
       final int green = rand.nextInt(255);
       final int blue = rand.nextInt(255);
       final TextView tf = (TextView) findViewById(R.id.textView1);

       // SLEEP 1 SECOND HERE ...
       Handler handler = new Handler();
       handler.postDelayed(new Runnable() {
           public void run() {
            tf.setBackgroundColor(Color.rgb(red, green, blue));
           }
        }, 1000);   
    }
}

但是当我按下按钮时没有任何反应。作为初学者,我将非常感谢任何建议如何解决这个问题。

2 个答案:

答案 0 :(得分:0)

尝试调用tf.invalidate()强制重绘。

此外,如果您希望它每秒更新30秒,您应该将1000更改为i * 1000(而不是像评论所暗示的那样睡觉)。正如目前所写的所有postDelayed几乎同时结束。

你也可以在循环之外移动处理程序的创建,不需要创建倍数。

答案 1 :(得分:0)

3个小时后我终于解决了这个问题。 for循环标题中有一个错误。 正好在 i&gt; = 30 。写得像这样,循环中的代码永远不会启动。它必须 i <= 30 。多么愚蠢的错误-_-

所以代码现在看起来像这样:

public void click(View v) {
    Handler handler = new Handler();
    final Random rand = new Random();
    for(int i=1; i <= 30; i++){         
        handler.postDelayed(new Runnable() {
            public void run() {
                int red = rand.nextInt(255);
                int green = rand.nextInt(255);
                int blue = rand.nextInt(255);
                TextView tf = (TextView) findViewById(R.id.textView1);
                tf.setBackgroundColor(Color.rgb(red, green, blue));                 
            }
        }, i * 1000);                   
    }       
}

它正在工作!