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无法正常工作












0 0
原创粉丝点击