2015-06-06 45 views
5

我無法在for循環中延遲方法assign_backgrounds()。我試圖創建一個西蒙說遊戲,但,而不是延遲和顯示下一個按鈕,「西蒙」按下,它顯示所有的按鈕一次。任何幫助在這裏將不勝感激。謝謝。如何在java中的for循環中延遲方法?

boolean simonsTurn = true; 
int x = 4; 
int s; 
int delay = 1000; 
int array_values[] = new int[]{1,2,3,4}; 


public void simonSays() { 
    // running = true; 
    if (simonsTurn == true) { 
     go(); 

     for (int i = 0; i < x; i++) { 
      Handler handler = new Handler(); 
      handler.postDelayed(new Runnable() { 
       public void run() { 
        go(); 
       } 
      }, 1000); 
     }    
    } 
} 

public void go(){ 
    s = random_int_between(0,3); 
     assign_backgrounds(array_values[s]); 
} 

public void assign_backgrounds(int array_values){ 

    Handler handler = new Handler(); 

    if(array_values == 1){ 
     button1_.invalidate(); 
     button1_.setBackgroundResource(R.drawable.goatclicked); 
     button1_.refreshDrawableState(); 

     handler.postDelayed(new Runnable(){ 
     public void run(){ 
     button1_.invalidate(); 
     button1_.setBackgroundResource(R.drawable.goat); 
     button1_.refreshDrawableState();}}, 1000); 
     } 
    else if(array_values == 2){ 
     button2_.invalidate(); 
     button2_.setBackgroundResource(R.drawable.pigclicked); 
     button2_.refreshDrawableState(); 

     handler.postDelayed(new Runnable(){ 
      public void run(){ 
       button2_.invalidate(); 
       button2_.setBackgroundResource(R.drawable.pig); 
       button2_.refreshDrawableState();}}, 1000); 
    } 
    else if(array_values == 3){ 
     button3_.invalidate(); 
     button3_.setBackgroundResource(R.drawable.chickenclicked); 
     button3_.refreshDrawableState(); 

     handler.postDelayed(new Runnable() { 
      public void run() { 
       button3_.invalidate(); 
       button3_.setBackgroundResource(R.drawable.chicken); 
       button3_.refreshDrawableState();}}, 1000); 
    } 
    if(array_values == 4) { 
     button4_.invalidate(); 
     button4_.setBackgroundResource(R.drawable.cowclicked); 
     button4_.refreshDrawableState(); 

     handler.postDelayed(new Runnable(){ 
      public void run(){ 
       button4_.invalidate(); 
       button4_.setBackgroundResource(R.drawable.cow); 
       button4_.refreshDrawableState();}}, 1000); 
    } 
} 

回答

1

這是因爲您正在創建處理程序非常快,然後他們都在同一時間開始。你應該看看Handler的工作和Asyncronous/Background任務。

現在回到您的問題,您正在調用一個循環,它正在創建處理程序,並且它們正在創建非常快(納秒)。然後,由於你的電話號碼爲postDelayed(),他們將從創建時間開始1秒。這就是爲什麼一切都在同一時間彈出!所有這些延遲帖子幾乎同時在併發後臺線程上執行。

代替for(int i,...)循環,您想擁有全局的int i,只需將其添加到文件的頂部即可。

在任何西蒙的回合結束時,你會想,在if, else if聲明內內assign_background(在的Runnable結束,那麼你要調用go()

這可能導致問題的原因你正嘗試從所有這些後臺線程訪問主線程,所以當你調用go函數時,你可能不得不調用函數runOnMainUIThread()作爲一個快速入侵函數。您瞭解處理程序,後臺進程和線程。瞭解Andro的絕對優秀知識ID只有FYI有堅實的文檔。