在 UI 线程中删除已发送的消息

Posted

技术标签:

【中文标题】在 UI 线程中删除已发送的消息【英文标题】:Deleting sent messages in UI thread 【发布时间】:2016-06-23 06:00:59 【问题描述】:

如果我有这个代码,让我再详细说明一下:

此对象由主 UI 线程创建:

Handler handler= new Handler();

然后我使用:

handler.postDelayed(new Runnable()
, 1000);

我的问题是,如果发布到主线程的消息队列,我可以取消该操作吗?

【问题讨论】:

你可以使用 removeCallback 方法。 在同一个处理程序对象上? 另外我怎样才能识别runnables? 【参考方案1】:

您可以使用用于发布它们的 Handler 上的 removeCallbacks() 方法删除以前发布的 Runnables。您需要发布对 Runnable 的准确引用。

在您的代码中,您发布了一个 Runnable,同时声明它是匿名内联的。如果你这样做,将不会保留对该 Runnable 的引用。相反,您可以将对该新 Runnable 的引用存储在成员变量中,或者在您想要删除它时不会忘记的东西中。

private Runnable r;  // assign before use
private Handler h;   // assign before use

private void schedule() 
    h.postDelayed(r, 99999);


private void cancel() 
    h.removeCallbacks(r);

【讨论】:

以上是关于在 UI 线程中删除已发送的消息的主要内容,如果未能解决你的问题,请参考以下文章

如何在android一条单独线程,更新ui ?

发送到 UI 线程的消息永远不会到达

mfc c++ 将带有 postmessage 的自定义用户消息从工作线程发送到主 ui 线程

handle机制的原理

主线程不能执行耗时的操作,子线程不能更新Ui

3.3 线程---Handler消息传递机制浅析