2013-04-08 29 views
105
public void onClick(View v) { 
     // TODO Auto-generated method stub 
     switch(v.getId()){ 
     case R.id.rollDice: 
      Random ranNum = new Random(); 
      int number = ranNum.nextInt(6) + 1; 
      diceNum.setText(""+number); 
      sum = sum + number; 
      for(i=0;i<8;i++){ 
       for(j=0;j<8;j++){ 

        int value =(Integer)buttons[i][j].getTag(); 
        if(value==sum){ 
         inew=i; 
         jnew=j; 

         buttons[inew][jnew].setBackgroundColor(Color.BLACK); 
               //I want to insert a delay here 
         buttons[inew][jnew].setBackgroundColor(Color.WHITE); 
         break;      
        } 
       } 
      } 


      break; 

     } 
    } 

Tôi muốn đặt độ trễ giữa lệnh giữa thay đổi nền. Tôi đã thử sử dụng bộ hẹn giờ và thử sử dụng chạy và bắt. Nhưng nó không hoạt động. Tôi đã thử điều nàyLàm thế nào để thiết lập sự chậm trễ trong Android?

Thread timer = new Thread() { 
      public void run(){ 
       try { 
           buttons[inew][jnew].setBackgroundColor(Color.BLACK); 
        sleep(5000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 

      } 
      }; 
    timer.start(); 
    buttons[inew][jnew].setBackgroundColor(Color.WHITE); 

Nhưng nó chỉ được đổi thành màu đen.

Trả lời

336

Hãy thử mã này:

final Handler handler = new Handler(); 
handler.postDelayed(new Runnable() { 
    @Override 
    public void run() { 
     // Do something after 5s = 5000ms 
     buttons[inew][jnew].setBackgroundColor(Color.BLACK); 
    } 
}, 5000); 
+24

nhiều hơn Thread.sleep(). –

+0

Nó hoạt động .Thanks –

+0

Giải pháp này giải thích tất cả các câu hỏi mà tôi có với các trình xử lý ở một số dòng mã. – Sierisimo

12

Sử dụng) phương pháp Thread.sleep(millis.

+16

không làm điều này trên luồng giao diện người dùng - các yếu tố khác cũng có thể ngừng phản hồi và sau đó hoạt động không thể đoán trước – jmaculate

+0

cảm ơn vì cảnh báo. thats chính xác những gì tôi cần, để trì hoãn thread UI. câu trả lời hoàn hảo cho nhu cầu của tôi. cảm ơn. – hamish

28

Bạn có thể sử dụng CountDownTimer hiệu quả hơn nhiều so với bất kỳ giải pháp nào khác được đăng. Bạn cũng có thể tạo ra các thông báo thường xuyên trên các khoảng thời gian trên đường đi bằng cách sử dụng phương pháp onTick(long)

Hãy nhìn vào ví dụ này cho thấy một 30seconds đếm ngược

new CountDownTimer(30000, 1000) { 
     public void onFinish() { 
      // When timer is finished 
      // Execute your code here 
    } 

    public void onTick(long millisUntilFinished) { 
       // millisUntilFinished The amount of time until finished. 
    } 
    }.start(); 
+0

Sau đó, bạn sẽ phải hủy hẹn giờ tại một số điểm – peter

1

Nếu bạn muốn làm một cái gì đó trong giao diện người dùng trên các khoảng thời gian đều đặn rất lựa chọn tốt là sử dụng CountDownTimer:

new CountDownTimer(30000, 1000) { 

    public void onTick(long millisUntilFinished) { 
     mTextField.setText("seconds remaining: " + millisUntilFinished/1000); 
    } 

    public void onFinish() { 
     mTextField.setText("done!"); 
    } 
    }.start(); 
17

Nếu bạn sử dụng thường xuyên chậm trễ trong ứng dụng của bạn, sử dụng lớp tiện ích này

import android.os.Handler; 

/** 
* Author : Rajanikant 
* Date : 16 Jan 2016 
* Time : 13:08 
*/ 
public class Utils { 

    // Delay mechanism 

    public interface DelayCallback{ 
     void afterDelay(); 
    } 

    public static void delay(int secs, final DelayCallback delayCallback){ 
     Handler handler = new Handler(); 
     handler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       delayCallback.afterDelay(); 
      } 
     }, secs * 1000); // afterDelay will be executed after (secs*1000) milliseconds. 
    } 
} 

Cách sử dụng:

// Call this method directly from java file 

int secs = 2; // Delay in seconds 

Utils.delay(secs, new Utils.DelayCallback() { 
    @Override 
    public void afterDelay() { 
     // Do something after delay 

    } 
}); 
+0

đó là những gì tôi đang tìm kiếm .. – Qasim

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