handler 消息机制

我们先来说下

大多数都会这样回答,一个Handler允许发送和处理Message和Runable对象,UI主线程会自动分配一个Looper(消息轮询器),每个Looper中封装着MessageQueue(消息队列),遵循先进先出原则。Looper负责不断的从自己的消息队列里取出队头的任务或消息执行。一般是在子线程执行完耗时操作之后,通过Handler的sendMessage或post方法将Message和Runable对象传递给MessageQueue,而且在这些对象离开MessageQueue时,Handler负责执行他们(用到handleMessage方法,主要执行刷新UI的代码)。那下面我们分析下为什么这部分的大多数?

什么情况下(为什么)使用handler?

大家都知道handler是更新于UI界面,当然更新UI界面要在主线程,子线程不支持。而子线程做一些耗时操作得到的数据无法及时更新Ui界面,比如在加载数据+下载图片等等 需要网络加载的这些操作都需要耗时,这时候我们需要重新创造一个子线程异步处理耗时操作,这样就不会堵塞主线程导致卡顿的情况,出现ANR现象。异步处理成功后如果这个时候我们需要更新视图操作就不能直接更新,这个时候Handler就起到了作用。、

这样来说我们可以知道 handler一般用于主线程与子线程之间的通讯,主要是用于异步消息的处理。

handler机制是由MessageQueue、Looper来构建和处理的消息机制。我们来单独说下。

MessageQueue:看名字就能知道这是消息队列,用来存放线程消息

Looper:消息循环。MessageQueue来存储消息,Looper则是以无限循环的方式去查找消息。一个线程可以产生一个Looper对象,由它来管理此线程里的MessageQueue(消息队列)。

handler通过sendMessage或者post去将消息发送到MessageQueue中,而MessageQueue的next()方法会将消息返回给Looper,Looper接受到的消息就会处理,接着Handler最终调用handlerMessage()来处理消息。

Handler创建发送以及处理消息。

创建消息

每一个消息被需要被指定的Handler处理。android消息机制引入了消息池,Handler创建消息,首选查询消息池是否有消息存在,如有则直接取出消息,如没有则创建一个新的消息对象。

消息池的作用,我们使用消息池可以让消息不被使用时,并不作为垃圾回收,提高了对消息的复用,减少GC(垃圾回收)的次数。

发送消息

UI主线程初始化第一个Handler时候会通过ThreadLocal创建一个Looper;该Looper与UI主线程一一对应,使用ThreadLocal的目的是保证每一个线程值创建唯一一个Looper;之后其他Handler初始化的时候直接获取第一个Handler创建的Looper。Looper初始化的时候会创建一个消息队列MessageQueue。

处理消息

UI主线程通过Handler循环查询消息队列,当有消息时存在时,就将从消息队列中取出,通过消息的参数判断消息对应的handler,将消息分发到指定的Handler进行处理。

从源码分析 这边我会及时提高自己,并且会发第二篇关于Handler源码分析的博客。

猜你喜欢

转载自blog.csdn.net/sqj199567/article/details/81562596