1.Android消息机制主要指Handler的运行机制,Handler底层需要MessageQueue和Looper的支撑,MessageQueue在内部存储结构是采用单链表的数据结构来存储消息列表。
系统之所以要提供Handler,最主要的原因就是为了解决在子线程中无法访问UI的矛盾。
2.Looper以无限循环的形式去查找MessageQueue是否有新消息,如果有消息就处理,否则一直等待。
3.Handler创建的时候会采用当前线程的Looper来构造消息循环系统,那么Handler内部如何获取当前线程的Looper,答案就是ThreadLocal
4.ThreadLocal可以在不同线程中互不干扰的存储并提供数据,通过它可以轻松的获取每个线程的Looper.
注意:
a.线程默认没有Looper,所以使用Handler就必须为线程创建Looper.
b.a点所说的并不包括主线程--UI线程,也就是ActivityThread,ActivityThread被创建时会初始化Looper,这也就是为什么默认使用Handler的原因。
5.Android规定了访问UI只能在主线程中,如果子线程访问UI,就会程序抛出异常。源码如下:
void checkThread(){
if(mThread != Thread.getCurrentThread(){
throw new CalledFromWrongThreadException(“ only the orginal thread that created a view hierarchy can touch its view.”);
}}
6.系统为什么不允许在子线程中访问UI?
a.试想一下,在多线程中并发访问可能会怎么样?UI控件处于不可预期的状态,我们不知道UI会变成什么样子。所以说Android的控件不是线程安全的。
b.为什么系统不对UI控件的访问加上锁机制?加上UI锁一是变的逻辑复杂,二是降低UI的访问,锁机制会堵塞某些线程执行。
c. 所以 虽简单高效的就是单线程模式来处理UI操作。