如何清除UI线程队列?

5

我使用runOnUIThread方法将Runnable任务传递到主线程队列,但在发送新任务之前,我需要清除之前发送的所有队列任务。如何操作?

3个回答

7

使用一个Handler来进行发布。它具有与runOnUiThread相同的效果。在您的处理程序实例上,您可以调用removeCallbacks(null),它将删除处理程序队列中的每个元素,或者removeCallbacks(yourannableinstance),它将删除yourannableinstance类型的每个元素


同意上面的答案。使用Handler是更好的选择。除此之外,可以查看链接http://developer.android.com/reference/android/os/Handler.html,并使用http://developer.android.com/reference/android/os/Handler.html#removeCallbacks(java.lang.Runnable)来移除。 - Raghunandan

4
您可以使用removeCallbacks(Runnable r)方法。如果它们是匿名的,则可以使用removeCallbacksAndMessages(null);。如果这不能解决问题,请给我更多细节。

1
UI线程也是一个Looper线程,它只有一个消息队列。因此,如果您在UI线程中创建一个处理程序,然后调用handler.post(runnable),可运行任务将存储在消息队列中。如果您调用runOnUIThread(),则运行任务也将存储在相同的消息队列中。
5289    public final void runOnUiThread(Runnable action) {
5290        if (Thread.currentThread() != mUiThread) {
5291            mHandler.post(action); // runOnUiThread also calls handler.post()
5292        } else {
5293            action.run();
5294        }
5295    }

mHandler.removeCallbacksAndMessages(null)可以帮助您删除所有的回调和消息。


从我的观察来看,使用相同的ThreadHandler looper但不同的差异处理程序变量无法使用.removeCallbacksAndMessages(null)来取消彼此,必须使用相同的处理程序引用。即使是两个new Handler(Looper.getMainLooper());也无法相互取消。 - 林果皞

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接