2013-02-04 22 views
6

Các Handler lớp android chứa phương pháp này:Handler.postAtTime vs Handler.postDelayed

public final boolean postAtTime (Runnable r, Object token, long uptimeMillis) 

để viết Runnable tại một thời điểm nhất định. Các token có thể được sử dụng sau này để loại bỏ các callback để r từ hàng đợi thông điệp nhờ vào phương pháp này:

public final void removeCallbacks (Runnable r, Object token) 

các phương pháp sau đây không tồn tại trong lớp Handler

public final boolean postDelayed (Runnable r, Object token, long delay) 

Có một lý do chính đáng để không cung cấp một phương pháp như vậy?

+0

Bạn đang thiếu gì ở đó? Mã thông báo? –

+0

có mã thông báo và do đó khả năng xóa cuộc gọi lại đến nội dung nào đó đã được đăng với postDelayed – ben75

+0

Bạn luôn có thể gọi 'Handler.removeCallbacks() 'bằng Runnable của bạn. Hoạt động xuất sắc nếu bạn hỏi tôi. –

Trả lời

5

Sau khi xem xét mã nguồn, các đối tượng thẻ cuối cùng đi đến tin nhắn:

public final boolean postAtTime(Runnable r, Object token, long uptimeMillis) 
308 { 
309  return sendMessageAtTime(getPostMessage(r, token), uptimeMillis); 
310 } 

private static Message getPostMessage(Runnable r, Object token) { 
608  Message m = Message.obtain(); 
609  m.obj = token; 

Và postDelay

public final boolean postDelayed(Runnable r, long delayMillis) 
330 { 
331  return sendMessageDelayed(getPostMessage(r), delayMillis); 
332 } 

Nếu những gì bạn muốn là

public final boolean postDelayed (Runnable r, Object token, long delay) 

Vậy tại sao không chỉ sử dụng

public final boolean postAtTime (Runnable r, Object token, long uptimeMillis) 

vì nó giống nhau.

Update, quên để thêm video này:

public final boolean sendMessageDelayed(Message msg, long delayMillis) 
442 { 
443  if (delayMillis < 0) { 
444   delayMillis = 0; 
445  } 
446  return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis); 
447 } 
+0

ok ... vì vậy có vẻ như không có lý do chính đáng để không có 'postDelayed (Runnable r, Object token, long delay)' trong API – ben75

+0

Có, nhưng bạn luôn có thể đề xuất nó cho các nhóm Android. – wtsang02

+0

Từ những gì nó trông giống như, các đối tượng mã thông báo là một suy nghĩ trong lớp Handler để lớp học là hơi không đầy đủ. – DeeV

0

Để xóa bài đăng runBable r từ trình xử lý H, chỉ cần gọi H.removeCallbacks (r). Tại sao bạn cần một mã thông báo?

+0

Theo như tôi hiểu, mã thông báo cho phép bạn chỉ chọn một số cuộc gọi lại đến r (nếu runnable được đăng nhiều lần) – ben75

+0

Ok tôi thấy, nếu bạn thực sự cần mã thông báo này với một runDable postDelayed, bạn có thể mở rộng lớp Handler thêm một thuộc tính token và tạo phương thức postDelayed của riêng bạn với token này:/ – psykhi

2

Nhìn vào nguồn Handler, dường như có:

private final Message getPostMessage(Runnable r, Object token) { 
    Message m = Message.obtain(); 
    m.obj = token; 
    m.callback = r; 
    return m; 
} 

Mà có thể được sao chép cho những gì bạn muốn: Thay vì gọi postDelayed, bao gồm runnable của bạn trong một thông báo như vậy

sendMessageDelayed(getPostMessage(r, token), delayMillis); 

sau đó bạn có thể sử dụng removeCallbacks() với mã thông báo làm thông số

+0

Nhưng nó đòi hỏi bạn phải xử lý tin nhắn, đó là một cái gì đó tôi hiếm khi làm bởi vì nó có nghĩa là tôi không thể sử dụng Handler ngay ra khỏi hộp. –

+0

có bạn có thể. thông báo sẽ thực sự đạt được Handler.handleMessage, nhưng việc thực hiện mặc định là chạy Message.callback. nếu bạn nhìn vào mã cho Handler.post (Runnable), nó tạo ra một tin nhắn trong cùng một thời trang tôi đăng – njzk2

+0

Bạn nói đúng. Tôi đã nhầm lẫn khi tôi nhận xét. –

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