Android Handler机制

📅 2026/7/4 9:45:53
Android Handler机制
1、Handler模型Handler机制是一种比较典型的生产者与消费者模型。生产者Handler负责产生消息,将消息送到MessageQueue中,根据时间先后排队等待处理。Looper每次从队头取消息,判断执行时间到了,则将它丢给Handler去执行。这个过程发送消息通常在一个线程执行,而在Looper取消息并执行时则在当前Looper所在的线程。因而,这里发生了线程的切换。这也是Handler用于线程间通讯的原理。我们通常说Looper是指主线程Looper,它是在应用程序起来的时候,系统帮我们创建的。而发送消息的是在子线程完成,这也就是Handler完成子线程到主线程切换的原理。2、源码分析这一章节,通过跟踪系统主线程Looper创建过程,理解与之有关的Handler、Message、MessageQueue、Looper等相关类的主要能力。2.1、Looper的初始化Android应用程序本质上也是一个Java程序。我们知道Java程序是从main函数开始。Android应用程序也是一样。只不过这部分系统帮我们封装好了,我们只要写Activity、Service这些组件,就可以完成Android的开发。Android应用程序的入口main函数是在ActivityThread类里面。主线程Handler也是在这个函数里面进行初始化。我们看到函数的最后两行分别是Looper.loop() 和 throw new RuntimeException("Main thread loop unexpectedly exited") 函数。可以看到如果执行到最后会抛出异常,实际上如果不抛出异常,我们知道Java的main函数执行完,程序将要退出。之所以我们应用程序能够一直存在,主要是因为在Looper.loop函数里面会执行一个无限的for循环,周而复始的处理消息,让Android程序持续存活并完成各种功能。因而,Android应用程序也被称为消息处理系统。后面详细看下这个函数。Looper.prepareMainLooper这个函数的功能就是创建主线程Looper。这里调用prepare()方法进行Looper的创建。它有两个重载方法,一个带参数,一个不带参数。prepare(boolean quitAllowed), quitAllowed参数的作用是用于标识Loop循环是否可以退出。主线程是不可以退出的。子线程的Loop循环可以通过调用looper.quit()方法退出。prepare方法中,我们看到如果此时已经存在Looper则会抛出异常,由此可见每一个线程的最多只能调用一次prepare()来创建自己的Looper。每个线程最多只能有一个Looper对象。如果此时没有Looper对象,则创建一个Looper对象保存到ThreadLocal中。在Looper类的构造函数中,创建一个MessageQueue对象和获取当前线程对象,将它们赋给Looper的成员变量,Looper对象就创建完成了。