Handler原理总结

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方法处理消息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值