1、handler的作用
handler是android线程之间的消息机制,主要的作用是将一个任务切换到指定的线程中去执行,(准确的说是切换到构成handler的looper所在的线程中去出处理)android系统中的一个例子就是主线程中的所有操作都是通过主线程中的handler去处理的。
2、handler的架构
Handler的运行需要底层的 messagequeue和 looper做支撑。
3、handler原理
3 .1 、首先说messagequeue,messagequeue 是 一 个 消 息 队 列 , 它是采用单链表的数据结构来存储消息的,因为单链表在插入删除上 的效率非常高。(Meaasgequeue主要包含一个是插入消 息的 enqueuemessage方法,和一个取出一条消息的next方法。)
3.2、然后说 looper,looper在安卓的消息机制中是扮演着消息调度的角色,具体来说就是他会不停的从 messagequeue中查看 是否有新消息,如果有,并且这个消息需要执行,就从队列中取出这个消息进行执行,(死循环遍历消息:取消息的线程会先阻塞一段时间(队头消息的执行时间减去当前时间),然后从队列中取出队头消息),否则会一直阻塞在messagequeue的next那里。(构成 一个 looper是需要一个 messagequeue,而构成一个 handler则需 要一个 looper,)另外looper一般是调用Looper.prepare()方法使用 threadlocal在线程的ThreadLocalMap中存储一个looper的,线程中有了looper之后就可以在这个线程中创建一个 handler了。
3.2、然后说 looper,looper在安卓的消息机制中是扮演着消息调度的角色。
Looper取消息的过程是这样的:
如果队列中有消息:
1、判断队头消息的执行时间是否大于当前时间,如果大于,就调用nativePollOnce阻塞一段时间(队头消息的执行时间-当前时间)然后取出队头消息进行执行。
2、否则就立即取出队头消息进行执行。
3、如果队列中没有消息,就一直阻塞,直到下一个消息来到,才唤醒取消息的线程继续上述循环。
Message next() {
final long ptr = mPtr;
if (ptr == 0) {
return null;
}
int pendingIdleHandlerCount = -1; // -1 only during first iteration
int nextPollTimeoutMil