首页 > 学院 > 开发设计 > 正文

菜鸟从源码分析Handler消息机制

2019-11-14 09:01:38
字体:
来源:转载
供稿:网友

1.Handler简介

Android中规定只允许在UI主线程当中来操作UI,在子线程中不允许更新UI,而当我们需要在子线程中进行一些耗时操作完成后需要更新界面UI,此时我们该怎么办,这个时候我们就可以用到Handler,所以可以说Handler的作用是为了通知主线程更新ui,但这只是Handler的一个作用,只是我们开发时常常用Handler来更新UI而已。在这里很多人会疑问为什么规定要只能在主线程更新UI,因为多个子线程来同时操作UI的话,则容易造成很多不可知的现象,即线程是不安全的,很多人也会疑问为啥不用锁机制呢,锁机制的话有两个缺点:a、锁机制让UI更新逻辑变得更复杂 b、锁机制会阻碍一些线程,使更新效率大大降低。

2.Handler消息机制中关联到的一些类:Looper,MessageQueue,ThreadLocal,Message等

3.Handler源码分析

首先看构造函数

上面的源码清晰的说明:首先会获取当前线程的Looper对象,为null则直接报错,因此在子线程中我们必须自己调用Looper.PRepare()来创建Looper对象,其次获取到Looper对象后则获取looper当中的MessageQueue对象,这两个对象获取到后对消费的分发处理则有了保障。这两个类后面会详细描述。

接着看我们常用的handmessage方法和sendMessage方法,我们主要说这两个方法。

这个handmessage方法我们要实现的,其实实际上是dispatchMessage方法中处理消息,这个很简单,大家应该都看得懂。接下来sendMessage方法:

这个方法也很简单,相信大家都看得懂,简单就是调用MessageQueue的enqueueMessage方法把消息存进MessageQueue中。也就是Handler其实是一个领导者,它通过协调Looper和MessageQueue等进行协同作业。

4.Looper源码分析

Looper轮询器的意思,就是无限轮询MessageQueue中的消息,有就发出来让handler处理,没有就等待中。

同样看prepare()方法和loop()两个关键方法:


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表