Android的消息机制

来源:互联网 发布:热敏标签打印软件 编辑:程序博客网 时间:2024/04/30 05:28

概述:Android的消息机制主要是指Handler的运行机制,Handler的运行需要底层的MessageQueue和Looper支撑。MessageQueue的中文翻译是消息队列,它内部存储一组消息,对外提供插入和删除的工作。虽然叫消息队列,但是他的内部存储结构是采用单链表的数据结构来存储消息列表。Looper的中文翻译为循环,在这里可以理解为消息循环。由于Message只是一个消息的存储单元,它不去处理消息,而Looper以无限循环的形式去查找是否有新的消息,如果有的话就处理消息(其实是交给Handler处理消息),否则就一直等待着
线程是默认没有Looper的,如果需要使用Handler就必须为线程创建Looper(主线程除外)

消息机制的工作原理
Handler创建时会采用当前线程的Looper来构建内部的消息循环系统,如果当前线程没有Looper,那么就会报错
Handler创建完毕后,这个时候其内部的Looper以及MessageQueue就可以和Hander一起协同工作了,通过Handler的post方法讲一个Runnable对象投递到Handler内部的Looper去处理,也可以通过Handler的send()方法发送一个消息,这个消息同样会在Looper中处理,其实post方法最终也是通过send方法来完成的。当Handler的send方法被调用时,他就会调用MessageQueue的equeueMessage方法将这个消息放到消息队列中,然后Looper发现有新消息到来时,就会处理这个消息,最终消息中的Runnable或者Handler的handleMessage方法就会被调用。注意,Looper是运行在Handler所在的线程中的,这样一来Handler中的业务逻辑就会被切换到创建Handler所在的线程中去执行。

Handler的工作原理
Handler发送消息的过程仅仅是向消息队列中插入了一条消息,MessageQueue的next()方法就会返回这条消息给Looper,Looper接收到了消息就开始处理了,最终消息由Looper交给Handler处理,即Handler的dispatchMessage()方法会被调用,这事Handler就进入了处理消息的阶段

消息队列的工作原理
MessageQueue主要包含两个操作,插入和读取。读取操作本身会伴随着删除操作。插入和读取对应的方法分别为equeueMessage和next。MessageQueue叫消息队列,但是它内部的实现并不是用的队列,实际上它是通过一个单链表的数据结构来维护消息列表。

Looper的工作原理
Looper在Android的消息机制中扮演着消息循环的角色,具体来说它会不停的从MessageQueue中查看是否有新消息,如果有新消息就会立刻处理,否则就一直阻塞在那里。
构造方法:
private Looper(boolean quitAllowed){
mQueue=new MessageQueue(quitAllowed);
mThread=Thread.currentThread();
}
创建Looper:通过Looper.prepare()即可从当前线程创建一个Looper,接着通过ooper.loop()来开启消息循环

0 0
原创粉丝点击