Android Handler机制

Handler机制简介

Handler是一个异步消息处理者,是一个消息分发对象,进行发送消息和处理消息。它里面包含线程队列和消息队列,Handler机制主要分为Handler(异步消息处理者)、Looper(消息泵)、Message(消息封装的载体)、MessageQueue(消息池)。

Looper:在Android的消息机制中扮演着消息循环的角色,具体来说就是它会不停地从MessageQueue中查看是否有新消息,如果有新消息就会立即处理,否则就一直阻塞在哪里;在我们创建Handler对象前需要创建一个Looper对象,在每个线程中,通过ThredLocal来保持每个线程中只保留一个Looper。

Message:消息封装的载体,它可以在内部携带少量的信息,用于再不同线程之间交换数据。除了what字段,还可以用arge1和arg2字段来携带一些整型数据,使用obj字段携带一个Object对象。

MessageQueue:消息池,它的数据结构是一个单向链表,Message就是通过时间的顺序来插入到链表中,Looper再从MessageQueue中获取Message并且发送到Handler中。

Handler机制的作用

1.Hanlder机制主要用于异步线程的处理,可以将一个任务切换到某个指定的线程中去操作。
2.Handler可以让你运行在某个线程上,共享线程的消息队列。
3.接收消息、发送消息、派发消息和处理消息。
4.可以通过Handler制作倒计时。

Handler的使用

1.实例化Handler(这里注意我们如果在子线程中示例化Handler需要先实例化Looper)
2.通过Message.obtain();实例化一个Message对象将需要发送的消息设置进去
3.通过Handler.sendMessage()发送到MessageQueue中
4.在Handler的handleMessage()方法中接收Message对象并对Message进行处理

Handler机制的工作的原理分析

在这里插入图片描述

从上图中我们可以看到我们我们首先是通过Handler来将Message消息发送消息队列中,然后由Looper对象将Message消息取出再返回给我们的Handler对象。

消息队列是由消息队列,由Looper所持有,但是消息的添加是通过Handler进行;

消息循环和消息队列都是属于Thread,而Handler本身并不具有Looper和MessageQueue(大家可以从源码中看到MessageQueue是在Looper中实例化,源码太多,有兴趣的小伙伴可以自己去看一下);
在这里插入图片描述

但是消息系统的建立和交互,是Thread将Looper和MessageQueue交给某个Handler维护建立消息系统模型。所以消息系统模型的核心就是Looper。消息循环和消息队列都是由Looper建立的,而建立Handler的关键就是这个Looper。

线程中就是通过Looper.loop()方法中来实现消息循环从下图中我们可以看到loop()方法中有一个死循环.
在这里插入图片描述

Handler是怎么样将Message发送到MessageQueue中去的

1.我们点击Handler中可以看到在Handler的构造方法中通过Looper.myloop()方法获取到looper对象并通过loop.mQueue来获取到MessageQueue的对象。
Handler获取Looper对象和MessageQueue对象

2.我们获取到Looper对象和MessageQueue之后然后看Message添加到MessageQueue中去

在这里插入图片描述
在这里插入图片描述

从上图中我们可以看到Message通过Message.next()方法按照时间顺序不断添加到消息队列中去。

Looper对象又是怎么样从MessageQueue中获取的Message对象呢

在这里插入图片描述
在这里插入图片描述

Message消息是从MessageQueue的next()方法中不断获取到的消息对象。
消息派发是由Message的target完成,这个target是什么呢?是一个Handler(大家可以在Message的源码中的成员属性中可以看到),消息系统是通过Handler用来与外部交互,把消息派发出去,然后再dispatchMessage中将Message发送到HandlerMessage方法中,最后我们就可以在handlerMessage方法中获取到Message对象并引用。

关注我的博客地址 :后续为大家更新Looper.loop是怎样在线程中保持单一的和Looper.loop()中由一个死循环为什么不会造成主线程阻塞和ANR?

麻烦各位大佬点个赞,如果不好请大家指出来,我也可以修正一下我的知识
请大家关注我的博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值