Android的消息机制
2016-06-30 14:08
239 查看
概述: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()来开启消息循环
线程是默认没有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()来开启消息循环
相关文章推荐
- 许多数据中心的工作者很满意他们的工作,将鼓励他们的孩子继续从事这份工作
- Tomcat端口被占用解决方法(不用重启)
- 零编程经验的我是如何找到工作的
- “传奇”图象数据存储方式
- C#数据结构之顺序表(SeqList)实例详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#实现单链表(线性表)完整实例
- C#定义并实现单链表实例解析
- C#数据结构之单链表(LinkList)实例详解
- SQL Server误区30日谈 第18天 有关FileStream的存储,垃圾回收以及其它
- 数据结构之Treap详解
- C++实现图的邻接表存储和广度优先遍历实例分析
- 详解Android文件存储
- C语言实现单链表逆序与逆序输出实例
- 【数据结构与算法】数组应用4:多项式计算Java版