Android 开发艺术探索笔记(20)
Android的消息机制概述
首先任何的UI操作都要在UI线程即主线程中进行,ViewRootImpl中就对UI操作做了验证,这个验证工作是由ViewRootImpl的checkThread完成的。Handler的存在主要是为了子线程无法访问UI线程的问题。当我们要那样子做的时候,我们要给当前线程创建Looper,或者在一个有Looper的线程中创建一个Handler。
Handler创建完毕后,Looper和MessageQueue就可以一起工作了,首先Handler的post将一个Runnable投递到Handler内部的Looper中去,或者send一个消息,同样是发送到内部的Looper中。接下来是send的工作过程,当Handler使用send发送消息时,它会调用MessageQueue的enqueueMessage方法将消息放入消息队列,然后Looper发现有新的消息来时,就会处理这个消息,最终消息中的Runnable或者Handler的handlerMessage方法就会被调用。下面是线程和Handler操作的关系:
Android消息机制分析
ThreadLocal的工作原理:
ThreadLocal是线程内部的一个数据存储类,可以用在某些数据是以线程为作用域并且不同的线程具有不同的数据副本。Looper的作用域就是线程,并且不同的线程Looper不同,这时候我们通过ThreadLoacl来获取Looper。通过实验可以发现ThreadLocal可以在不同的线程中维护一套数据的副本并且互相不干扰。
ThreadLoacal是一个泛型类:public class ThreadLocal< T>,这里为set方法。
Thread类里面有专门存储ThreadLocal的数据就是ThreadLocal:Values localValues,这个通过上图中的values得到,如果它为空,则初始化它,然后将数据put进入localValues中。这个localValues内部是一个table,然后存储位置在索引上+1即:table[index+1]=value。然后是get方法
同样是从线程中的取出localValues。