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所在的
线程中去执行了。
Message的callback是一个Runnable对象,实际上就是Handler的post方法所传递的Runnable参数
Handler的工作原理
Handler工作主要包含消息的发送和接收过程,通过post的一系列方法以及send的一系列方法来实现,而post方法最总是通过send的一系列方法来实现的。
Handler最总会交给dispatchMessage方法
调用,而检查的Message的Callback实际上是Handler的post方法所传递的Runnable参数
Callback可以代替创建Hander的实例而去使用handler
Handler是必须通过Looper来构造Handler.
public void dispatchMessage(Message msg){
if(msg.callback != null){
//当message是runnable的情况,也就是Handler的post方法传递的参数,这种情况下直接执行runnable的run方法
handleCallback(msg);
} else {
if(mCallback != null){{//如果创建Handler的时候是给Handler设置了Callback接口的实现,那么此时调用该实现的handleMessage方法
if(mCallback.handleMessage(msg)){
return;
}
}
handleMessage(msg);//如果是派生Handler的子类,就要重写handleMessage方法,那么此时就是调用子类实现的handleMessage方法
}
}
public Handler(Looper looper){
this(looper, null, false);
}