Android的消息机制
Android的消息机制其实就是Handle的运行机制,Handle需要Looper和MessageQueue,MessageQueue是消息循环系统,以队列的形式向外提供插入和删除操作,但是实现它的数据结构是单向链表,Looper处理MessageQueue中的消息,如果有消息就取出一个处理,如果没有就一直循环等待。Handle创建以后需要使用Looper来构建消息循环系统,通过ThreadLocal可以得到每个线程的Looper,ThreadLocal可以在每个线程中存储数据。但是通常普通线程是没有Looper的,需要创建Looper以后才可以创建消息循环系统。主线程默认一开始会初始化Looper和MessageQueue。
Handle通常被用来更新UI,由于主线程不能执行耗时操作,耗时操作比如I/O或者网络请求应该由子线程去完成,如果完成以后需要更新UI,只要使用Handle切换到主线程即可。子线程不能更新UI是因为UI不是线程安全的,不能加锁是因为加锁会导致UI更加复杂和效率更加低下。
Handle创建以后会采用当前线程的Looper创建消息队列如果当前线程没有Looper就会报错,Handle创建好以后,就可以和Looper和消息循环队列一起工作了。然后通过Handle的post或者send方法可以将一个Runnable投递到MessageQueue,使用enqueueMessage添加到队列中,当Looper检测到有消息以后,调用next方法取出消息,最终Runnable或者Handle的handleMessage方法就会执行,
ThreadLocal的工作原理
是一个线程内部的数据存储类,通过它可以在指定线程内存储数据,数据存储以后只有在指定线程中取出数据,其他线程不行,可以通过它获取当前线程的Looper,再使用Looper创建消息循环队列。
消息队列的工作原理
使用enqueueMessage方法向消息队列中添加数据,使用next方法取出并删除消息队列中的数据,next方法是一个无限循环,没有消息就一直阻塞,有消息就取出,并从单链表中移除。
Looper的工作原理
每个线程需要有Looper才可以创建Handle,可以通过prepare方法创建Looper,再调用loop方法对MessageQueue不断进行查询,loop方法是一个死循环,只有当MessageQueue为空的时候才会跳出循环,当在消息队列中取出一个消息,Looper就会处理这个消息,。
Handle的工作原理
Handle的工作主要包含消息的发送和消息的接收,有send和post方法发送消息,post也是基于send方法的。可以看到send方法中调用了enqueueMessage方法往队列中添加消息。next取出一个消息以后Looper开始处理,Looper其实也是交给Handle处理,Handle的dispatMessage方法中调用handleMessage来执行具体的处理过程。
3.png