Handler伪代码帮助理解
2018-03-23 00:59
120 查看
Handler相关主要的类有如下几个:
Loop
Message
MessageQueue
ThreadLocal
Handler
下面是伪代码,可以更直观了解handler的调用流程
Loop
Message
MessageQueue
ThreadLocal
Handler
下面是伪代码,可以更直观了解handler的调用流程
public class Handler{ Looper mLooper;//循环获取消息 MessageQueue mQueue;//消息队列 public Handler(){ mLooper = Looper.myLooper(); mQueue = mLooper.mQueue; } //Looper中循环中新取到的消息调用此方法 public void dispatchMessage(Message msg) { handleMessage(msg); } //空实现,需要复写 public void handleMessage(Message msg){ } //消息放到消息队列中 public boolean sendMessage(Message msg) { MessageQueue queue = mQueue; msg.taget = this;//注意把当前的handler赋给对应的msg queue.enqueueMessage(msg, uptimeMillis); } }
public final class Looper { //对不同线程存储自己的Looper对象 private ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>(); private Looper(){ //维护一个消息队列 mQueue = new MessageQueue(); } private static void prepare() { if (sThreadLocal.get() != null) {//只能调用一次,如果调用第二次回清除之前的消息队列 throw new RuntimeException("Only one Looper may be created per thread"); } sThreadLocal.set(new Looper()); } public static Looper myLooper() { return sThreadLocal.get(); } //无限循环的从队列中获取消息 public static void loop(){ Looper me = myLooper(); MessageQueue queue = me.MQueue; for(;;){ Message msg = queue.next();//没有消息了,这里会阻塞 if(msg == null){ return;// } //发送给对应的Handler处理 msg.target.dispatchMessage(msg); } } }
public final class MessageQueue{ boolean enqueueMessage(Message msg, long when) { //对消息的重新排序,通过判断消息队列里是否有消息以及消息的时间对比 } } public class Message{//链表结构 public static Message obtain() {//从消息池里获取 synchronized (sPoolSync) { if (sPool != null) { Message m = sPool; sPool = m.next; m.next = null; m.flags = 0; // clear in-use flag sPoolSize--; return m; } } return new Message(); } }
相关文章推荐
- 用最通俗易懂的代码帮助新手理解javascript闭包 推荐
- StateBag.cs实现代码 对理解实现自定义状态管理很有帮助。
- 虚函数表测试代码 帮助理解虚函数表
- 最好自己手动敲下代码,对理解有很大帮助。
- 用最通俗易懂的代码帮助新手理解javascript闭包 推荐
- 用最通俗易懂的代码帮助新手理解javascript闭包
- 指针与数组的示例代码(帮助理解)
- 利用eclipse中的各种功能帮助你理解代码
- 批处理代码【watch】 (无聊之作)帮助新手理解基本循环命令
- activeMQ消息队列之JMS基础(附了一些代码帮助理解前期可跳过)
- 理解$HandlerLabel HANDLER $HandleLabel 宏
- Swift属性的理解和代码
- [IT动态]谷歌爬虫可理解JS代码:更好解析富媒体
- WTL 向导生成代码的理解
- Android 深入理解 ButterKnife,让你的程序学会写代码
- 采用 GLM 从代码层面理解 OpenGL 坐标系统
- CNN卷积神经网络代码理解
- yii2:doajax(post)会报500错误 (个人项目代码奉上,希望对大家有帮助, 下面是执行一个删除操作)
- TextBox.Multiline缩进现象不是bug(文档解读,帮助你理解MSDN难懂的词句)
- Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系