Handler、Looper、MessageQueue深入解析
来源:互联网 发布:破解软件分享平台 编辑:程序博客网 时间:2024/05/13 17:22
前段时间,本人研究了一下Android的Handler的源码,结合网上其他帖子的讲解,现在对Handler做一个总结
1.我们为什么需要Handler?
众所周知,Handler是Android中用来处理异步的类,通常用来更新UI线程的界面。那我们为什么不能直接在子线程中更新呢?让我们来试想这样一种情况,假如有很多子线程同时更新主界面的话,势必会造成非常混乱的情况,所以Android提供了Handler来处理这个问题。
2.先来看Handler的用法
可以看到,在子线程中封装的Message通过在主线程中定义的Handler投递到UI线程中处理,接下来我们来看看Handler是如何实现的,先来看看Handler的构造函数
Handler获取了调用线程的Looper,请注意,是调用线程!!(原因请看接下来对Looper的分析)所以Handler只能在UI线程中被创建
接下来,发送消息
结合图片理解
3.Looper分析
看了上面的图片,相信大家对Handler的发送消息过程有了一定的了解,接上文,现在消息在调用线程的Looper中的消息队列里。在分析Looper之前,我想问大家一个问题,刚刚的代码示例中,并没有Looper的身影,那UI线程的Looper是在哪里生成的呢?请看
Looper出现了,先看第一个函数
ThreadLocal是线程局部变量,它为每一个线程准备了一个独立的Looper,详细的讲解请看ThreadLocal多线程实例详解
至此,Android通过ThreadLocal巧妙的将Looper与调用线程关联了起来
接下来,看第二个函数Looper.loop()
我们可以看到,loop()将消息取出,并调用对应Handler的dispatchMessage()来处理消息
Handler开始处理消息了
最后,Handler调用覆写的handleMessage()开始处理消息了(我们一般采用这种方法)
至此,Handler发送、处理消息的流程已经讲完了,下面来对这个做一些总结
1.一个线程只能有一个Looper,但是可以有多个Handler
2.Handler更像是一个辅助类,它封装了消息投递、消息投递等接口
3.在子线程中使用Handler要注意调用Looper.prepare()和Looper.loop(),不然Handler无法正常工作
- Handler、Looper、MessageQueue深入解析
- android Handler Looper MessageQueue 深入解析
- Handler深入解析(Looper,MessageQueue联系)
- Handler,MessageQueue,Looper解析
- Handler、Looper、MessageQueue解析
- Handler Looper MessageQueue解析
- Handler+Looper+MessageQueue深入详解
- Handler+Looper+MessageQueue深入详解
- Handler+Looper+MessageQueue深入详解
- Handler+Looper+MessageQueue深入详解
- Handler+Looper+MessageQueue深入详解
- 深入理解Looper,MessageQueue,Handler
- 深入理解Handler、Looper、Messagequeue
- 深入源码解析Android中的Handler,Message,MessageQueue,Looper
- 深入源码解析Android中的Handler,Message,MessageQueue,Looper
- 深入源码解析Android中的Handler,Message,MessageQueue,Looper
- Handler,Looper,Message,MessageQueue源码解析带你深入理解
- 深入源码解析Android中的Handler,Message,MessageQueue,Looper
- 当程序员遇到硬盘损坏导致代码丢失时心理变化的5个阶段
- JAVA IO 详解2
- linux shell学习(二)
- POJ1144 Network(判断割点)
- Android内存管理之道
- Handler、Looper、MessageQueue深入解析
- 子DIV使用float后撑不开父DIV的问题
- wxpython 文件夹选择对话框 DirDialog
- 傅里叶变换的意义,理解
- count、find、binary_search、lower_bound、upper_bound
- SQLite中的时间日期函数(转)
- android start activity getIntent 返回异常的问题
- 【Java集合源码剖析】Vector源码剖析
- POJ 2391 Ombrophobic Bovines(二分+floyd+最大流)