Làm thế nào để thiết lập độ trễ trong Android?


164
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ộ đếm thời gian và thử sử dụng chạy và bắt. Nhưng nó không hoạt động. Tôi đã thử nó

 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 thay đổi thành màu đen.

Câu trả lời:


499

Hãy thử mã này:

import android.os.Handler;
...
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);

1
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ý tại một số dòng mã.
Sierisimo

45
Tôi luôn quay lại bài này vì tôi quá lười để viết nó mỗi lần. Cảm ơn bạn.
Eugene H

Vâng, nó rất tốt nhưng tôi có rất nhiều tin nhắn để chờ sau đó hiển thị. Vì vậy, nhiều bước đi cho vấn đề. làm thế nào có thể giải quyết vấn đề nhiều vấn đề
mehmet

2
Giải pháp này tạo ra rò rỉ bộ nhớ vì nó sử dụng một lớp ẩn danh bên trong và ẩn danh, nó hoàn toàn giữ một tham chiếu đến lớp bên ngoài của nó, hoạt động. Xem stackoverflow.com/questions/1520887/ cấp để có giải pháp tốt hơn.
tronman

@EugeneH Sử dụng Mẫu trực tiếp để dễ dàng hơn stackoverflow.com/a/16870791/4565796
Saeed Arianmanesh

38

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

Hãy xem ví dụ này hiển thị đếm ngược 30 giây

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

23

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

import android.os.Handler;


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.
    }
}

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

    }
});

1
Tại sao ? Đây là chi phí thuần túy và phức tạp ... không có gì
juloo65

Nếu chúng ta sử dụng độ trễ thường xuyên, thì có một định dạng cố định cho độ trễ là tốt. Tôi không nghĩ có quá nhiều chi phí vì có thêm một giao diện và một phương thức.
aruke

18

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


30
không làm điều này trên luồng UI - các yếu tố khác cũng có thể ngừng đáp ứng và sau đó hành xử không thể đoán trước
diễn ra vào

1
cảm ơn đã cảnh báo đó chính xác là những gì tôi cần, để trì hoãn chuỗi UI. câu trả lời hoàn hảo cho nhu cầu của tôi cảm ơn.
ham

7

Nếu bạn muốn làm một cái gì đó trong UI theo khoảng thời gian thường xuyên, tùy chọn rất 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();

Nó sạch hơn Handler .
Ahsan

3

Xử lý câu trả lời trong Kotlin:

1 - Tạo chức năng cấp cao nhất trong tệp (ví dụ: tệp chứa tất cả các chức năng cấp cao nhất của bạn):

fun delayFunction(function: ()-> Unit, delay: Long) {
    Handler().postDelayed(function, delay)
}

2 - Sau đó gọi nó bất cứ nơi nào bạn cần nó:

delayFunction({ myDelayedFunction() }, 300)

2

Bạn có thể sử dụng điều này:

import java.util.Timer;

và cho sự chậm trễ, thêm:

 new Timer().schedule(
                    new TimerTask(){
                
                        @Override
                        public void run(){
                            
                        //if you need some code to run when the delay expires
                        }
                        
                    }, delay);

trong đó delaybiến là tính bằng mili giây; ví dụ được đặt delaythành 5000 cho độ trễ 5 giây.


0

Đây là một ví dụ trong đó tôi thay đổi hình nền từ hình này sang hình khác với độ trễ mờ dần 2 giây theo cả hai cách - làm mờ dần hình ảnh gốc 2 giây thành hình mờ 2 giây thành hình ảnh thứ 2.

    public void fadeImageFunction(View view) {

    backgroundImage = (ImageView) findViewById(R.id.imageViewBackground);
    backgroundImage.animate().alpha(0f).setDuration(2000);

    // A new thread with a 2-second delay before changing the background image
    new Timer().schedule(
            new TimerTask(){
                @Override
                public void run(){
                    // you cannot touch the UI from another thread. This thread now calls a function on the main thread
                    changeBackgroundImage();
                }
            }, 2000);
   }

// this function runs on the main ui thread
private void changeBackgroundImage(){
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            backgroundImage = (ImageView) findViewById(R.id.imageViewBackground);
            backgroundImage.setImageResource(R.drawable.supes);
            backgroundImage.animate().alpha(1f).setDuration(2000);
        }
    });
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.