android消息机制
来源:互联网 发布:dior fix it color 编辑:程序博客网 时间:2024/05/12 09:33
Android的消息机制主要是指Handler的运行机制,Handler的运行需要底层的MessageQueue和Looper的支撑。
Android的消息机制的主要作用:是将一个任务切换到某个指定的线程执行。
因为Android规定访问UI只能在主线程中进行,如果在子线程中访问UI,那么程序就会抛出异常。由于这一点限制,所以必须在主线程中访问UI。但是Android不建议在主线程中进行耗时操作,否则会导致程序太久无法响应而产生ANR。所以如果在工作线程从服务器中获取数据然后在UI中显示,就必须用到Handle。
系统为什么不允许在子线程中访问UI呢?这是因为Android的UI控件不是线程安全的,如果在多线程中并发访问可能会导致UI控件处于不可预期的状态。那么为什么系统不对UI控件的访问加上锁呢?缺点有两个:1.首先加上锁机制会让UI访问的逻辑变得复杂;2.锁机制会降低UI访问效率,因为所机制会阻塞某些线程的执行。
MessageQueue的工作原理
MessageQueue主要包含两个操作:插入和读取。读取操作本身会伴随着删除操作。插入和读取对应的方法分别为:enqueueMessage和next。其中enqueueMessage的作用就是往消息队列中插入一条消息,而next的作用是从消息队列中取出一条消息并将其从消息队列中移除。next方法是一个无限循环的方法,如果消息队列中没有消息,那么next方法一直阻塞在这里。当有新消息到来时,next方法会返回这条消息并将其从单链表中移除。
Looper的工作原理
Looper的作用其实就是不停的调用MessageQueue的next方法,如果有新消息就会立即处理,否则就一直阻塞在那里。在Looper的构造方法中它会创建一个MessageQueue。
Handler的工作需要Looper,没有Looper的线程就会报错。但是在主线程中创建Handler就不需要创建Looper,因为在主线程默认存在一个Looper,在程序的入口即main()方法中创建Looper。
创建Looper的方法:Looper.prepare(); Looper.prepareMainLooper()(这个方法主要是给主线程创建Looper使用,其本质也是prepare()方法来实现);
另外Looper提供了一个getMainLooper方法,通过他可以在任何地方取到主线程Looper。
Looper也是可以退出(quit和quitSafely)、quit是直接退出,quitSafely是设定一个退出标记,然后把消息队列的以有消息处理完毕后才完全地退出。所以在子线程中,如果手动为其创建了Looper,那么在所有的事情完成以后应该调用quit方法来终止消息循环,否则这个子线程就会一直处于等待的状态。
Looper中最重要的一个方法--loopr方法,只有调用了loop后,消息循环系统才会真正地起作用。loop方法是一个死循环,会不停的调用MessageQueue的next方法,跳出循环的唯一方法就是当next方法返回了null。当Looper的quit方法被调用时,就会调用MessageQueue的quit方法,next方法就会返回null。在next有返回值时(返回一个Message对象),Looper就会处理这条消息:msg.target.dispatchMessage(msg),msg.target是发送这条消息的Handler对象,这样这个消息就会最终交个它的dispatchMessage方法来处理。
Handler的工作原理
Handler的工作主要包含消息的发送和接收过程。消息的发送通过post的一系列方法以及send的一系列方法来实现,post的一系列方法最终也是通过send的一系列方法来实现。
send方法实际上就是消息放入消息队列中。而在Looper中取出这条消息后会调用Handler的dispatchMessage方法。在dispatchMessage方法中最终会调用handlerMessage方法。
- Android消息机制(Handler机制)
- android Handler机制 消息机制
- Android 消息处理机制
- Android消息机制
- android 消息机制
- Android消息机制(一)
- Android消息处理机制
- Android消息处理机制
- Android消息机制(一)
- Android 中的消息机制
- Android 消息通知机制
- Android消息机制学习
- Android消息机制(1)
- Android消息机制
- android消息机制
- Android消息机制
- Android的消息机制
- android消息处理机制
- 最详细的 Android Toolbar 开发实践总结
- 类与类之间的关系
- 使用克隆快速创建ZeroNet博客或者论坛
- Coins (hdu 2844)多重背包
- 『Python高级编程』学习笔记之一: 第四章——选择好的名称
- android消息机制
- redis的主从复制
- 舞伴配对问题
- Codeforences Round #349 (div2)
- 集合中打括号的替换
- Light OJ 1094 - Farthest Nodes in a Tree【树的直径 两次bfs】
- Adapter中的跳转 & Caused by:Android.util.AndroidRuntimeException
- NIO Buffer的细节
- UVa 401 Palindromes