2010-12-07 17 views
199

Tôi đang sử dụng handler.postDelayed() để tạo khoảng thời gian chờ trước khi giai đoạn tiếp theo của ứng dụng diễn ra. Trong thời gian chờ, tôi đang hiển thị hộp thoại có thanh tiến trình và hủy nút.hủy quy trình handler.postdelayed

Vấn đề của tôi là tôi không thể tìm được cách để hủy tác vụ đã đăng trước trước khi hết thời gian.

+0

bản sao có thể có của [Làm thế nào để loại bỏ một runnable từ một đối tượng xử lý được thêm bởi postDelayed?] (Http://stackoverflow.com/questions/3627216/how-to-remove-a-runnable-from-a- handler-object-added-by-postdelayed) – sschuberth

Trả lời

399

tôi làm điều này để gửi một trì hoãn Runnable:

myHandler.postDelayed(myRunnable, SPLASH_DISPLAY_LENGTH); 

Và điều này để xoá bỏ nó: myHandler.removeCallbacks(myRunnable);

+60

Nếu bạn có khả năng hủy bỏ tất cả các cuộc gọi lại và tin nhắn trên trình xử lý và không muốn phải giữ tham chiếu đến runnable, điểm thứ ba trong câu trả lời được chấp nhận cho câu hỏi này là một cách khác mà dường như làm việc cho trường hợp của tôi anyway: http://stackoverflow.com/questions/11299440/onbackpressed-to-kill-a-handler-within-an-activity-android (về cơ bản gọi myHandler.removeCallbacksAndMessages (null);) – Mick

+0

removeCallbacksAndMessages có thể thực hiện thủ thuật, nhưng cá nhân tôi thích có quyền kiểm soát các runnables được lên lịch. Sắp xếp và xử lý một cặp Runnables sẽ không giết bạn biểu diễn ứng dụng; nếu không, nếu bạn cần nhiều hơn hai hoặc ba Runnables, bạn có thể cần thứ gì đó mạnh mẽ hơn, imho. –

14

Một cách khác là để xử lý các Runnable bản thân:

Runnable r = new Runnable { 
    public void run() { 
     if (booleanCancelMember != false) { 
      //do what you need 
     } 
    } 
} 
+14

Sẽ không booleanCancelMember phải là cuối cùng, có nghĩa là nó không thể thay đổi và do đó vô ích cho mục đích này? – stealthcopter

+8

@stealthcopter không có nó không phải là. –

+0

Nếu bạn đang làm cho Runnable vô danh – pablisco

1

Nó làm việc cho tôi khi tôi gọi CancelCallBacks (điều này) bên trong bài đăng bị trì hoãn runnable bằng cách giao nó qua boolean

Runnable runnable = new Runnable(){ 
    @Override 
    public void run() { 
     Log.e("HANDLER", "run: Outside Runnable"); 
     if (IsRecording) { 
      Log.e("HANDLER", "run: Runnable"); 
      handler.postDelayed(this, 2000); 
     }else{ 
      handler.removeCallbacks(this); 
     } 
    } 
}; 
+0

Không có "CancelCallBacks" trong mã của bạn. Có lẽ vì nó không tồn tại? :) –

12

Trong trường hợp bạn không có nhiều nội/Runnables nặc danh thông qua để cùng xử lý, và bạn muốn hủy bỏ tất cả ở cùng một sự kiện sử dụng

handler.removeCallbacksAndMessages(null);

Theo tài liệu,

Remove bất kỳ bài đăng đang chờ xử lý nào của cuộc gọi lại và tin nhắn đã gửi có obj là mã thông báo. Nếu mã thông báo là null, tất cả các cuộc gọi lại và tin nhắn sẽ bị xóa.