2
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: ...

你知道为什么当这条消息通过时,每一个案例都是真实的吗?好像 var "id" 是 1, 2, 3 AND 4 AND 5 和其他所有

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

4

6 回答 6

3

好的,我看到这引起了很多关注。正如 JustWork 所说,您正在执行 for 循环并且所有情况都会立即处理,您只是创建 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 为零的时间。

希望这对您有所帮助并享受您的工作。

于 2013-05-17T01:41:30.107 回答
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: ...

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

于 2013-05-17T01:42:27.550 回答
0

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

于 2013-05-17T01:29:25.347 回答
0

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

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

于 2013-05-17T02:30:18.650 回答
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
    ...
    }
}

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

于 2013-05-17T01:33:53.753 回答
0

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

但是你也必须使用Asyncfor 循环的调用。这将使您不锁定 UI 线程。

于 2013-05-17T01:48:41.023 回答