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、4、5、その他すべてであるかのように

コードは各ループ間で 2 秒間待機しませんが、最初のループでそれらを true として取得します

4

6 に答える 6

3

わかりました、これは多くの注目を集めました。JustWork が for ループを実行していて、すべてのケースが即座に処理されると言ったように、2 秒待ってから実行する N 個のスレッドを作成しているだけです。すでに述べたように、投稿の遅延時間に 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

ループしているため、次の点を考慮してください。

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

コードは待つべきではありません。遅延の実行はRunnable待機することになっています。のコードはfor/switch最高速度で実行され続けます。

しかし、なぜスイッチがあるのでしょうか。配列がある場合は、などをT[] sq = {sq1, sq2, ...};使用して、スイッチを完全に削除できます。sq[sequence.get(i)].setBackgroundResource(R.drawable.square_show)

于 2013-05-17T02:30:18.650 に答える