功能划分
Handler的使用必须与几个组件一起。
*Message: Handler接收和处理的消息对象,类似于一个业务类,封装了一些变量。
*MessageQueue:一个队列容器,采用先进先出的原则管理Message。程序创建Looper对象的时候会在构造函数中创建MessageQueue对象。
*Looper:负责管理MessageQueue和Message对象,读取到MessageQueue中的Message之后就会采用sendMessage的方式把消息发送给对应(发送该消息)的Handler来处理。
要在一个线程中使用Handler,则该线程中必须要有一个MessageQueue对象。而MessageQueue是由Looper来管理的。所以在一个线程中必须要有一个Looper对象,而且每个线程只能有一个Looper对象。
而根据线程的不同分类,Handler的使用就大致可以分为两种情况。
UI线程使用Handler
分析
在UI线程中无需创建Looper对象,因为在应用启动,UI线程启动的时候 系统已经自动创建了一个Looper对象。
这里就要提到一个类ActivityThread,这个类是程序启动的入口
下面是该类的部分源码
public final class ActivityThread {
......
public static final void main(String[] args) {
......
Looper.prepareMainLooper();
......
ActivityThread thread = new ActivityThread();
thread.attach(false);
......
Looper.loop();
......
thread.detach();
......
}
}
其中可以看到该类中的main函数,这个函数就是进程的入口函数。在main函数中调用了 Looper.prepar