ThreadLocal
ThreadLocal并不是Android的sdk中的类,而是java.lang中的一个类,该类的作用是为线程创建一个基于线程的变量存储,称之为线程局部存储。简单的说,就是作用域在线程内,本线程内的该类的任何对象保持一致。
ThreadLocal可以使对象达到线程隔离的目的,它为每一个线程维护自己的变量拷贝,通过其中的set方法将变量绑定到线程上。ThreadLocal提供了一种解决多线程同步的问题解决方案,通过为每一份变量进行拷贝,这样的话,每个线程操作的都是属于自己的变量,而不是共同的一个变量,因此也就不需要同步锁了。在Android的异步线程中,ThreadLocal绑定的这个线程变量就是Looper的一个对象。
Looper类
Looper
类用来为一个线程跑一个消息循环。线程在默认情况下是没有消息循环与之关联的,Thread类在run()方法中的内容执行完之后就退出了,即线程做完自己的工作之后就结束了,没有循环的概念。
在Looper类中有一个成员变量mQueue(MessageQueue类的实例),该变量用于保存Looper中MessageQueue。 Looper通过静态方法Looper.prepare()方法来创建出一个MessageQueue对象。调用Looper类的 prepare()
方法可以为当前线程创建一个消息循环,调用loop()
方法使之处理信息,直到循环结束。注意,Looper.prepare()方法在一个线程中只能执行一次。大多数和消息循环的交互是通过 Handler
类进行的。
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop();
}
}
Handler类
Handler类用来发送和处理消息(Message)以及和线程的消息队列(MessageQueue
)关联的Runnable对象。Handler对象在同一个线程上下文中取得消息队列,对消息队列进行封装操作,最主要的就是SendMessage和担当起dispatchMessage这个实际工作。
外部系统需要向某个Android线程发送消息,必须通过属于该AndroidThread的Handler这个对象。每一个Handler对象都仅和一个线程及这个线程的消息队列关联。一个特定线程的所有Handler对象都会收到同样的方法。(这是一个“一对多”的关系)。如下图(图片来自网络)所示:
当你创建一个新的Handler对象,它会和创建它的这个线程/线程的消息队列绑定,从那个时刻开始,它将向这个消息队列传递消息和runnable对象,并且当它们从队列中出来时执行它们。
Handler主要有两种用途:
1.合理调度安排消息和runnable对象,使它们在将来的某个点被执行。
2.将一个动作入队安排在非当前线程执行。
Handler属于某个线程,取决Handlerd对象在哪个线程中建立。Handler在构建时做了如下的默认动作:
- 从线程上下文取得Looper。
- 通过Looper获取到消息队列并记录在自己的成员mQueue变量中
Handler使用消息队列进行对象封装,提供如下的成员函数:
- 通过 post(Runnable r)发送。Runnable是消息处理的回调函数,通过该消息的发送,引起Runable 的回调运行,post消息放置消息队列的前面。Message.callback=Runable.
- 通过 sendMessage发送。放置在所有的Post消息之后,sendMessage发送消息.
- dispatchMessage分发消息。消息带有回调函数,则执行消息回调函数,如何没有则使用默认处理函数:handleMessage。而handleMessage往往被重载成某个继承