2012-09-28 82 views
1

我的示例應用程序中有兩個按鈕,我希望一個接一個地改變按鈕的背景圖片,延遲時間爲4秒,至此我開發了代碼,你可以在下面看到它,但它會讓我的應用程序進入睡眠狀態,並且什麼都不顯示。如何在Android中更改背景圖片時的延遲時間爲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); 

    } 



    } 
+1

從研究postDelayed的工作方式開始。 (另外,你發佈的代碼不能編譯,因爲m是本地的,並且在匿名類中使用) – njzk2

回答

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); 

注意,這將繼續下去,直到時間的盡頭,或者當你的應用停止時。

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或類似)。

+0

在我的代碼中,如果(m == 0)可以選擇你的想法, – user1703737

+0

不確定這裏「適當的修改」是什麼意思。 –

+0

是否有人請解釋爲什麼這個迴應已經下了兩次而沒有評論? –

-1

您的while循環導致您的UI線程等待這些操作完成。你最好的兩個選項將是稱這是一個新的線程中:

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);