Android之Handler源码分析(第五篇:移除消息)
移除消息的方法,共5个
0、 一个参数,接受一个int值
public final void removeMessages(int what) { mQueue.removeMessages(this, what, null); }
局部变量what持有的int值最终会传入到Handler持有的MessageQueue对象mQueue的removeMessages()方法中,removeMessages接受三个参数,第一个是当前Handler对象,第二个就是当前传入的what值,最后一个参数这里传的是null,该参数接受的类型是Object。此后MessageQueue就会在它持有的消息队列中,把what值匹配的所有Message对象都删除掉
1、两个参数,接受一个int值,接受一个Object对象
public final void removeMessages(int what, Object object) { mQueue.removeMessages(this, what, object); }
跟(1号知识点)一样,也是调用了MessageQueue的removeMessages方法,不同的是这次可以多传入一个要匹配的Object对象,what值与Object对象,正是每个Message的what和obj可以持有的值与对象,此处只有what值相等、object也相等的所有Message对象,都会从MessageQueue里面的消息队列中被移除,此处object参数也可以传入null,这样只要消息队列中的what值匹配的所有Message就会被移除掉(等同于0号知识点)
2、一个参数,接受一个Runnable对象
public final void removeCallbacks(Runnable r) { mQueue.removeMessages(this, r, null); }
调用了Handler持有的MessageQueue的removeMessages方法,将当前Handler对象、Runnable对象、以及一个null值均传了进去,此处会对消息队列中的所有未执行的Message进行遍历,所有匹配Runnable的Message都将被从MessageQueue持有的单链表中移除掉
3、两个参数,接受一个Runnable对象、一个Object对象
public final void removeCallbacks(Runnable r, Object token) { mQueue.removeMessages(this, r, token); }
Runnable对象与Object同时匹配的Message,会从MessageQueue全部移除,此处的token也可以传null,此时该方法与上文中(3号知识点)的方法是一样的作用,当然这些参数仍是会传递给MessageQueue的removceMessages方法
4、一个参数,接受一个Object对象
public final void removeCallbacksAndMessages(Object token) { mQueue.removeCallbacksAndMessages(this, token); }
该Object对象token作为一个标记,它会传入到MessageQueue中到的removeCallbacksAndMessages中,在removeCallbacksAndMessages方法内部,会判断消息队列中每一个Message持有的obj字段与token指向的是不是一个对象,若相同,则会将这些匹配的Message全部会移除掉。此处的token也可以传null,这将会将所有消息全部干掉。
总结:
a、send系列方法提交的Message,需要移除的时候选用参数带有what的remove方法
b、post系列方法提交的Message,需要移除的时候选用参数为Runnable的remove方法
c、上文中remove系列方法的第一个参数均是当前Handler对象,说明这些移除方法只是将MessageQueue中对应的Handler发送的消息进行移除操作
d、可以为一个Handler发送的消息,都指定一个Object作为token,将来业务上不需要,可以根据token一下子移除掉未运行的消息,大佬真贴心
e、被移除的Message都是还未得到执行的Message,若已经执行的Message是不在MessageQueue持有的单链表中的
更多相关文章
- Android单元测试,模拟http的get和post请求,服务器脚本使用php
- Android轩辕剑之ActionBar之三
- Android(安卓)JNI 篇 - JNI回调的三种方法(精华篇)
- Android(安卓)获得Url、Uri字符串后面拼接的参数
- Android(安卓)xutil3.0完全解析
- Android画布和图形绘制---Canvas and Drawables(三)
- Android线程中Handle的使用
- Android(安卓)---- WebView与JavaScript交互调用(2)
- Android——Fragment介绍及两种基本使用方法