2015-06-06 26 views
5

Bir for döngüsü içinde assign_backgrounds() yöntemini geciktirmede sorun yaşıyorum. Ben bir Simon oyun, ancak oyun "gecikme" ve "Simon" basar sonraki düğmeyi göstererek, bir kerede tüm düğmeleri gösterir diyor. Burada herhangi bir yardım büyük takdir edilecektir. Teşekkürler.Java'da for döngüsündeki bir yöntemi nasıl geciktiririm?

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

cevap

1

Eğer işleyicileri çok hızlı yaratıyor ve sonra hepsi aynı anda başlıyor çünkü. Handler'ın nasıl çalıştığına ve Asyncronous/Background görevlerine bakmalısınız.

Sorununuza geri döndüğünüzde, bir döngüyü çağırıyorsunuz ve hepsi de üst üste işleyicileri yaratıyor ve çok hızlı oluşturuluyorlar (nanosaniye). Daha sonra, postDelayed() aramanız nedeniyle bu oluşturma süresinden 1 saniye sonra başlayacaklar. İşte bu yüzden her şey aynı anda patlıyor! Tüm bu gecikme direkleri eşzamanlı arkaplan iplikleri üzerinde hemen hemen aynı anda yürütülür. Bunun yerine küresel int i want to have for(int i,...) döngünün

, sadece dosyanın üstüne ekleyin. Simon'un dönüşün herhangi sonunda

Eğer assign_background içindeki if, else if beyanı içinde isteyeceksiniz (Runnables sonunda, o zaman go() aramak isteyeceksiniz. Bunun nedeni sorunlara neden olabilir

bütün bu arka plan iş parçacığı ana iş parçacığı erişmeye çalışıyorsanız. Eğer go işlevini çağırdığınızda hızlı bir hack olarak işlev runOnMainUIThread() aramanız gerekebilir böylece.

Sonuçta

, sen kadar bazı sorunlar yaşayacaksın İşleyicileri, Arka Plan Süreçlerini ve Konularını anlıyorsunuz ve Andro'yu öğrenmek için kesinlikle harika bilgiler kimlik sadece FYI üzerinde katı belgelere sahiptir.

İlgili konular