切换循环进入for:为什么每个情况都是真的?

时间:2013-05-17 01:24:26

标签: java android for-loop switch-statement

for(int i = 0; i <= lvl-1; ++i) {

        id = sequence.get(i);

        switch(id) {
        case 1:
            sq1.setBackgroundResource(R.drawable.square_show);

            hnd.postDelayed(new Runnable() {
                public void run() {
                    sq1.setBackgroundResource(R.drawable.square);
                }
            }, 2000);

            break;
        case 2:
            sq2.setBackgroundResource(R.drawable.square_show);

            hnd.postDelayed(new Runnable() {
                public void run() {
                    sq2.setBackgroundResource(R.drawable.square);
                }
            }, 2000);

            break;
        case 3: ...

你知道为什么当这个cicle通过时,每个案例都是真的吗? 好像var“id”是1,2,3和4和5以及其他每个

代码不会在每个循环之间等待2秒,但在第一个循环中将它们设为true

6 个答案:

答案 0 :(得分:3)

好的,我看到这引起了很多关注。正如JustWork所说你正在执行循环并且所有的情况都是立即处理的,你只需要创建N个线程,等待2秒然后再进行。正如我所说,你可以通过在延迟时间后添加2000 * i来应用简单的黑客攻击。喜欢这个

case 1:
        sq1.setBackgroundResource(R.drawable.square_show);

        hnd.postDelayed(new Runnable() {
            public void run() {
                sq1.setBackgroundResource(R.drawable.square);
            }
        }, 2000 * (i + 1));

这意味着您将立即创建所有线程,并且每个线程将在显示之前等待2秒。 i + 1是i为零的时间。

希望这有助于并享受您的工作。

答案 1 :(得分:1)

postDelayed是一个异步调用。或者你把一个线程睡眠,或者你实现一个通知并等待响应,或者你增加每个循环的延迟,如

int delay = 0;

for(int i = 0; i <= lvl-1; ++i) {

    id = sequence.get(i);

    delay += 2000;

    switch(id) {
    case 1:
        sq1.setBackgroundResource(R.drawable.square_show);

        hnd.postDelayed(new Runnable() {
            public void run() {
                sq1.setBackgroundResource(R.drawable.square);
            }
        }, delay);

        break;
    case 2:
        sq2.setBackgroundResource(R.drawable.square_show);

        hnd.postDelayed(new Runnable() {
            public void run() {
                sq2.setBackgroundResource(R.drawable.square);
            }
        }, delay);

        break;
    case 3: ...

但最好的解决方案是实现通知处理程序。

答案 2 :(得分:0)

我认为id和lvl变量的声明和值存在一些问题。请在调试模式下检查它们的值。

答案 3 :(得分:0)

因为您正在循环,请考虑以下事项:

for(int i = 0; i <= lvl-1; ++i) { 
    id = sequence.get(i); // this probably returns i

    switch(id) {
    case 1:
        // this will execute during the *first* iteration of the for loop
    case 2:
        // this will execute during the *second* iteration of the for loop
    ...
    }
}

这是我最好的猜测,但无法看到其余的代码。

答案 4 :(得分:0)

我建议如果你想延迟你的循环,你必须使用Thread.sleep(2000);

但你也必须使用Async调用for循环。这将使您无法锁定UI线程。

答案 5 :(得分:0)

代码不应该等待。延迟Runnable的执行应该等待。 for/switch中的代码只是以最大速度继续运行。

但为什么要切换呢?如果你有一个数组T[] sq = {sq1, sq2, ...};,你可以使用sq[sequence.get(i)].setBackgroundResource(R.drawable.square_show)等,并完全取消开关。