2013-02-04 52 views
6

了Android Handler類包含以下方法:Handler.postAtTime VS Handler.postDelayed

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

發佈一個Runnable在給定時間。該token以後可以用來從消息隊列中取出感謝回調r這種方法:

public final void removeCallbacks (Runnable r, Object token) 

不會在Handler類存在下面的方法

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

有不提供這種方法的一個很好的理由?

+0

您在那裏缺少什麼?令牌? –

+0

是的令牌,所以能夠刪除回調postDelayed發佈的東西 – ben75

+0

你可以隨時調用你的Runnable的'Handler.removeCallbacks()'。如果你問我,效果很好。 –

回答

5

查看源代碼後,該令牌對象最終傳遞到消息:

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; 

而且postDelay

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

如果你想要的是

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

那麼,爲什麼不只是使用

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

因爲它是一樣的。

更新,忘了補充一點:

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 ......所以似乎沒有理由在API – ben75

+0

中沒有'postDelayed(Runnable r,Object token,long delay)'是的,但您始終可以將其推薦給Android組。 – wtsang02

+0

從它看起來的樣子來看,令牌對象是Handler類中的一種事後考慮,所以該類有點不完整。 – DeeV

0

要從處理程序H中刪除postDelayed runnable r,只需調用H.removeCallbacks(r)。你爲什麼需要一個令牌?

+0

據我瞭解,令牌允許你選擇只有一些回調(如果可運行多次發佈) – ben75

+0

好吧我看到,如果你真的需要這個令牌postDelayed可運行,你可以擴展Handler類到添加一個令牌屬性並使用此令牌創建您自己的postDelayed方法:/ – psykhi

2

縱觀處理器源,它似乎有:

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

可以複製你想要的東西:而不是調用的postDelayed,將你的runnable包裹在這樣的消息中

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

然後您可以使用帶有令牌的removeCallbacks()作爲參數

+0

但它需要你處理消息,這是我很少做的事情,因爲這意味着我無法立即使用處理程序。 –

+0

是的,你可以。該消息的確會達到Handler.handleMessage,但默認實現是運行Message.callback。如果您查看Handler.post(Runnable)的代碼,它將以我發佈的相同方式創建一條消息 – njzk2

+0

您是對的。我評論時犯了一個錯誤。 –

相關問題