1

サンプルアプリケーションに2つのボタンがあり、ボタンの背景画像を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);

    }



    }
4

3 に答える 3

1
int mark = 0; 

button2.postDelayed(new Runnable()
    {
        public void run()
        {
            switch(mark++){
                 case 0:button2.setBackgroundResource(R.drawable.buttonyellow); break;
                 case 1:button2.setBackgroundResource(R.drawable.buttongreen); break;
                 ..ect
            }
            if(mark==Max)mark=0;

         button2.postDelayed(this,4000);
        }
    }, 4000);

これは、時間の終わりまで、またはアプリが停止するまで続くことに注意してください。

于 2012-09-28T14:53:53.153 に答える
1

postDelayed現在のスレッドの実行を遅らせないため、スレッドはm == 0ケースを繰り返し投稿してスタックします。

おそらく、投稿された Runnable で、背景を設定して数値をインクリメントするだけでなく、このロジックを (投稿する新しい Runnable を選択するために) 再度呼び出す何らかのメソッドを呼び出す必要があります。

例 (警告: テストされていないコード)

// assuming button1 and button2 are available
new Runnable() {
  private int m = 0;
  private final int delay = 4000;

  @Override
  public void run() {
    if (m == 0) {
      button1.setBackgroundResource(R.drawable.buttonyellow);
      button1.postDelayed(this, delay);
    } else if (m == 1) {
      button2.setBackgroundResource(R.drawable.buttonyellow);
      button2.postDelayed(this, delay);
    }
    // more cases here -- also consider making m wrap around
    m++;
  }
}.run();

当然、これは UI スレッドで呼び出す必要があります (UI スレッドで呼び出されない場合は、UI スレッドにディスパッチする必要がありますpost)。

于 2012-09-28T14:50:21.300 に答える
-1

while ループが原因で、これらの操作が完了するまで UI スレッドが待機します。最良の 2 つのオプションは、これを新しいスレッド内で呼び出すことです。

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);
于 2012-09-28T14:53:06.767 に答える