最近在准备面试,在面试过程中,面试官经常会问的一些基础的知识点,如Handle的原理是什么,虽然每次都有认真去看,但是每次回答的时候都感觉 不尽人意。那么Handle 的原理到底是什么呢?使用的场景及相关概念是什么呢?今天我们就来好好分析一下Handle的机制及原理
前言
Handle 是Android SDK 提供给开发者进行异步消息处理的类,handle的使用范围不仅仅是去在子线程去更新UI操作,只是我们经常这样使用,通常的使用方法是我们在子线程进行网络请求等操作后,由于子线程不能只是去做UI操作,所以通过handle.send xxx Message(),然后在主线程中通过handle.handlemessage() ,获取handle 分发出来的消息去做相应的处理。
随着第三方事件总线的框架的流行,如AsynsTask ,eventBus,volley ,Retrofit等等,handle的使用相对弱化了一些,但是还是在我们编程的过程中不可缺少, 其实AsynsTask 是对Handle 进行了巧妙的封装,通过资料查询volley也是同样的原理,所以我们要弄清楚Handle的机制原理。
一:Handle机制中重要的参数 Handle , looper,messageQueue
Looper:(1)消息封装的载体,messageQueue是由looper来创建的,所有的handle发送的消息都是经过MessageQueue,
looper.looper()是一个死循环,不断的从messageQueue中取出message 交给handle去消费处理,当没有message的时候 ,就阻塞,每个线程只有一个looper。
messageQueue:消息队列,单项链表的数据结构,遵循先进先出的规制。
Handle:负责接收l和处理消息。主要有sent和post方法。handle内部会与looper关联起来。
总结:Handle负责发送消息,looper负责接收handle发送过来的消息,并将消息回传给handle自己去处理
MessageQueue:是承载message的容器,是有looper创建的,和looper进行绑定。
二:消息机制的分析理解
主线程及UI线程(anctivityThread)创建的时候就创建Looper对象,创建Loopr后就开始创建MessageQueue ,也就是说主线程直接或者间接的创建looper和messageQueue。
handle的工作机制
1. handle 发送消息是调用MessageQueue 的EnQueueMeassgae方法向messageQueue中插入一条message.
2.looper不断地轮询调用MessageQueue的next方法
3、如果发现message就调用handler的dispatchMessage,如果dispatchMessage被成功调用,接着调用handlerMessage().