Handler、Looper、ThreadLocal、MessageQueue、Message

先说Looper。

Looper作用是:通过for循环MessageQueue队列中的的Message,然后触发Handler的HandleMessage回调方法。

1、Looper没有公共的构造方法,所以实例化用prepare()方法。

2、Looper没有getLooper()方法。获取自身实例,是静态的公共方法myLooper(); 

3、Looper的核心方法是loop(); 执行无限for循环【for(;;)】


Looper实例化:

在prepare()中不但有new Looper(); 还应该注意到私有构造Looper()中还有new MessageQueue();方法。


再说Handler。

Handler作用是:通过sendMessage方法将Message对象添加到MessageQueue中。

1、Handler的构造方法中,获取到了Looper对象(Looper.myLooper(),注意并没有实例化Looper),通过Looper对象获取到MessageQueue对象(looper.mQueue)。

2、Handler的核心方法是sendMessage。sendMessage(msg)调Handler的入队方法enqueueMessage(msg)方法。Handler的enqueueMessage(msg)方法,将Handler对象赋给了msg.target属性,然后又调了MessageQueue对象的入队方法enqueueMessage(msg),MessageQueue的enqueueMessage(msg)方法将msg添加到队列的最顶端。

3、Handler的公共方法dispatchMessage(msg),是在Looper的loop方法中调用。dispatchMessage方法中调用了mCallback.handleMessage(msg)回调方法。


再说ThreadLocal<T>。

ThreadLocal<T>作用是:通过set(T)方法,调用Thread中的ThreadLocal.Values对象来存储T对象。

1、ThreadLocal.Values类,有put方法,所以可以将Values理解为HashMap。

2、ThreadLocal本身并不存储Values对象或T对象,它是通过set方法通知currentThread的Thread对象中的成员变量ThreadLocal.Values localValues来存储T对象。

3、Looper的prepare方法实例化Looper并非简单的new Looper(),而是通过sThreadLocal.set(new Looper())来实现实例化,这样做可以解决多线程相同变量访问冲突问题(类似于synchronized用法)。同样Looper.myLooper()方法也是通过sThreadLocal.get()方法获取的Looper对象,而非简单的将Looper对象存为成员变量来用于获取对象。


另外,MessageQueue是个先进先出队列;Message类就是一个实体类,没什么特别的。

你可能感兴趣的:(Handler、Looper、ThreadLocal、MessageQueue、Message)