Android的消息机制主要是指Handler的运行机制以及Handler所附带的MessageQueue和Looper的工作过程。
大概的流程:
Handler创建完毕后,这个时候内部的Looper以及MessageQueue就可以和Handler一起协同
工作了,然后通过Handler的post方法将一个Runnable投递给内部的Looper去处理,也可以通
过Handler的send发送一个消息,这个消息同样会在Looper中处理。其实post的方法最终也是通过send方法完成的,接下来看一下send方法的工作过程。当Handler的send方法被调用时,它会调用MessageQueue中的enqueueMessage方法,将这个消息放入到消息队列中,然后looper发现有新消息来时,就会处理这个消息,最终消息中的Runnable或Handler中handleMessage方法被调用。
MessageQueue的工作原理:
其名字叫消息队列,其实内部实现并不是真正的消息队列,实际上是通过单链表的数据
结构来维护消息列表,单链表在删除和插入上比较有优势。
其主要有两个基本的操作,插入和读取;
插入:即enqueueMessage,就是向消息队列插入一条消息即单链表的插入操作。
读取:即next,读取操作本身伴随着删除操作.next 方法是个无限循环的方法,如果消息队列中没有消息,那么next方法会一直阻塞在那里。当有消息来时,会返回这个消息并将其从单链表中删除。
Looper的工作原理:
Looper在Android消息机制中扮演着消息循环的角色,具体来说就是不停的从MessageQueue中查看是否有新信息,如果有新消息就会立即处理,否则就会一直阻塞在那里.handler的工作需要Looper ,没有Looper就会报错。
new Thread("Thread#2"){
@overrade
public void run(){
//为当前线程创建Looper
Looper.prepare();
Handler handler=new Handler();
//开启消息循环
Looper.loop();
}
}
手动创建Looper时,所有的事情完成以后应调用quit来终止消息循环。否则这个子线程就会一直处于等待的状态。
Looper最重要的方法是loop,只有调用了loop后,消息系统才会真正的起作用。
Handler的工作原理
主要是发送和接受过程。Handler发送消息的过程是向消息队列中插入了一条消息,MessageQueue的next方法就会返回这条消息给Looper,Looper接受到消息就开始处理了,
最终消息由Looper交由Handler处理,即Handler的dispatchMessage会被调用。消息处理阶段开始:
data.png
网友评论