1. Handler
源码位于: platform/frameworks/base/core/java/android/os/Handler.java
Handler允许发送和处理与线程的MessageQueue关联的Message和Runnable对象。每个Handler实例都与单个线程和该线程的消息队列相关联。
当创建一个新的Handler时,它会被绑定到一个Looper上。Handler将会把Message和Runnable对象传递到Looper的消息队列上,并在Looper线程上执行它们。
Handler有两个主要用途:
(1) 调度Message和Runnable在未来的某个时间点执行;
(2) 在不同的线程上执行的操作;
private Handler mHandler = new Handler() {@Overridepublic void handleMessage(@NonNull Message msg) {super.handleMessage(msg);}
};
2. Looper
源码位于:platform/frameworks/base/core/java/android/os/Looper.java
用于为线程运行消息循环的类。默认情况下,线程没有与之关联的消息循环。创建一个Looper,需要在运行Looper的线程中调用prepare()方法,然后让Looper处理消息(Looper.loop()),直到Looper停止。
class LooperThread extends Thread {public Handler mHandler;public void run() {Looper.prepare();mHandler = new Handler(Looper.myLooper()) {public void handleMessage(Message msg) {// process incoming messages here}};Looper.loop();}
}
3. Message流转图
从上图中可以看出,handlemessage是位于调用栈中处理业务逻辑。因此,如在UI主线程处理操作比较耗时,会产生ANR。
4. HandlerThread
源码位于: platform/frameworks/base/core/java/android/os/HandlerThread.java
public class HandlerThread extends Thread
自带 Looper 的线程。 Looper 然后可以用于创建Handler处理程序。请注意,就像使用常规线程一样,仍然必须调用Thread.start()。
在用HandlerThread类创建出的对象,一般不实现run()方法,因为HandlerThread类中已经封装好run()方法。
5. ActivityThread
源码位于:platform/frameworks/base/core/java/android/app/ActivityThread.java
public final class ActivityThread extends ClientTransactionHandler;
ActivityThread,从名称上看它是Activity所属的线程,也就是大家熟悉的UI主线程(因为只有主线程才能处理UI相关的事务,包括UI界面更新)。
主线程与普通线程处理消息的机制很相似。普通线程只要prepare就可以了,而主线程使用的是prepareMainLooper。
普通线程生成一个与Looper绑定的Handler对象,而主线程是从当前线程中获取的Handler(thread.getHandler())












