Android的消息机制主要是指Handler的运行机制,Handler的运行需要底层的MessageQueue和Looper的支撑;
MessageQueue:消息队列,它的内存存储了一组消息,以队列的形式对外提供插入和删除的工作,内部结构:采用
单链表的数据结构来存储消息队列;
Looper:处理MessageQueue的消息,会以无限循环的形式去查找是否有新消息,有就处理无则等待,还要用到一个特殊的概念-ThreadLocal:并不是线程,作用:可以在每个线程中存储数据,
ThreadLocal可以在不同的线程中互不干扰地存储并提供数据,通过ThreadLocal可以轻松获取每个线程的Looper。线程默认是没有Looper的,如果需要使用Handler就必须为线程创建Looper;
UI线程即ActivityThread,ActivityThread被创建是就会初始化Looper,这也是在主线程中默认可以使用Handler的原因。
Handler创建完毕后,Looper和MessageQueue、Handler就可以一起协同工作了,1.通过Handler的post方法将一个Runnable投递到Handler内部的Looper中取处理
2.通过Handler的send方法发送一个消息,这个消息同样会在Looper中去处理;其中post方法最终也是通过send方法来完成;
send的过程:当Handler的send方法被调用时,它会调用MessageQueue的enqueueMessage方法将这个消息放入消息队列中,然后Looper发现有新的到来时,就会处理这个消息,
最终消息中的Runnable或者Handler的handleMessage方法就会被调用。注意Looper是运行在创建Handler所在的线程中的,这样一来Handler中的业务逻辑就被切换到创建Handler所在的
线程中去执行了。