Handler原理总结

来源:互联网 发布:单片机引脚定义 编辑:程序博客网 时间:2024/05/16 15:21

Handler用于将一个任务切换到某个指定线程中去执行,可以看成一个生产者消费者模式,
Handler在子线程中发送消息,最终是通过MessageQueue的enqueueMessage方法把Message对象添加到MessageQueue中,
MessageQueue维护了Message这个单链表的具体操作。

而主线程中Looper是系统自动创建的,在其loop方法用于读取MessageQueue中的消息对象,并交由handler的dispatchMessage方法去分发消息,
处理完成后回收Message对象。

Looper通过prepare方法创建,并用ThreadLocal持有这个对象。
为什么用ThreadLocal持有Looper对象?
一般来说,当某些数据是以线程为作用域并且不同线程具有不同副本的时候,
可以考虑采用ThreadLocal。
Looper就属于这种情况,如果不采用ThreadLocal,那系统就必须提供一个全局的
哈希表拱Handler查找指定线程的Looper。

分发消息的机制是:
1.先判断msg的callback是否为空,不为空则处理callback任务,这个任务是通过post方法已实现Runnable接口的形式添加的。
2.如果msg的callback为空,则判断Handler的成员Callback是否为空,如果不为空,则执行Callback的handleMessage方法的具体实现,
这个具体实现是以不需要派生Handler子类的形式生成Handler传入的参数。
3.如果执行callback的handlerMessage返回true,则结束消息处理。否则继续调用Handler的handleMessage方法处理消息。
4.如果没有传入callback的实现,而直接以派生子类的方式创建Handler,则直接执行Handler的handleMessage方法处理消息。

原创粉丝点击