2015-06-06 13 views
5

Tôi gặp sự cố khi trì hoãn phương thức assign_backgrounds() trong vòng lặp for. Tôi đang cố gắng để tạo ra một Simon nói trò chơi, nhưng thay vì trì hoãn và hiển thị nút tiếp theo mà "Simon" nhấn, nó cho thấy tất cả các nút cùng một lúc. Bất kỳ trợ giúp ở đây sẽ được đánh giá rất nhiều. Cảm ơn.Làm cách nào để trì hoãn một phương thức trong vòng lặp for trong 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); 
    } 
} 

Trả lời

1

Đó là vì bạn đang tạo bộ xử lý rất nhanh và tất cả đều bắt đầu cùng một lúc. Bạn nên xem xét công việc của Handler và các nhiệm vụ Asyncronous/Background như thế nào.

Bây giờ trở lại vấn đề của bạn, bạn đang gọi vòng lặp và tạo bộ xử lý tất cả liên tiếp và chúng đang được tạo rất nhanh (nano giây). Sau đó, tất cả họ sẽ khởi chạy 1 giây từ thời gian tạo đó vì cuộc gọi postDelayed() của bạn. Đây là lý do tại sao mọi thứ đều xuất hiện cùng một lúc! Tất cả các bài đăng chậm trễ này đang được thực hiện gần như cùng một lúc trên các luồng nền đồng thời.

Thay vì vòng lặp for(int i,...) bạn muốn có toàn cầu int i, chỉ cần thêm nó vào đầu tệp.

Vào cuối của bất cứ lần lượt Simon bạn sẽ muốn, bên trong báo cáo kết quả if, else if bên assign_background (ở phần cuối của Runnables, sau đó bạn sẽ muốn gọi go().

Điều này có thể gây ra vấn đề vì bạn đang cố gắng truy cập vào chuỗi chính từ tất cả các chủ đề nền này, vì vậy bạn có thể phải gọi hàm runOnMainUIThread() là một bản hack nhanh khi bạn gọi hàm go. bạn hiểu Trình xử lý, Quy trình nền và Chủ đề. Kiến thức tuyệt vời để tìm hiểu và Andro id có tài liệu vững chắc về nó chỉ FYI.

Các vấn đề liên quan