2015-06-06 1 views
5

У меня возникли проблемы с задержкой метода assign_backgrounds() в цикле for. Я пытаюсь создать Simon говорит, но вместо задержки и показывая следующую кнопку, которую «Simon» нажимает, показывает сразу все кнопки. Любая помощь здесь будет принята с благодарностью. Благодарю.Как отложить метод в цикле for в java?

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.

Теперь вернемся к вашей проблеме, вы вызываете цикл и создаете обработчики все подряд, и они создаются очень быстро (наносекунды). Затем все они запустится на 1 секунду из этого времени создания из-за вашего вызова postDelayed(). Вот почему все появляется одновременно! Все эти сообщения о задержке выполняются почти одновременно с параллельными фоновыми потоками.

Вместо цикла for(int i,...) вы хотите иметь глобальный int i, просто добавьте его в начало файла.

В конце любой очереди Саймона вы хотите, внутри if, else if заявления внутри assign_background (в конце Runnables, то вы хотите позвонить go().

Это может вызвать проблемы, потому что вы пытаетесь получить доступ к основному потоку из всех этих фоновых потоков, поэтому вам, возможно, придется вызвать функцию runOnMainUIThread() в качестве быстрого взлома при вызове функции go.

В целом, у вас будут проблемы, пока вы понимаете Handlers, Background Processes и Threads. Определенно большие знания, чтобы узнать об этом и Andro id имеет прочную документацию на нем только FYI.