Straightforward
/**
* 用来为一个线程运行消息循环的类。默认的线程本身是没有与之相关联的消息循环的;
* 要创建一个的话,在将要运行循环的线程中调用 {@link #prepare},然后调用
* {@link #loop} 来让它处理消息,直到循环停止。
*
*
* <p>与消息循环的大多数交互都是通过 {@link Handler} 类进行的。
*
* <p>这是一个典型的 Looper 线程实现的例子,
* 使用 {@link #prepare} 和 {@link #loop} 的分离创建一个初始的 Handler
* 来和 Looper 交流。
*
* <pre>
* class LooperThread extends Thread {
* public Handler mHandler;
*
* public void run() {
* Looper.prepare();
*
* mHandler = new Handler() {
* public void handleMessage(Message msg) {
* // 在此处理传入的消息
* }
* };
*
* Looper.loop();
* }
* }</pre>
*/
public final class Looper {
/*
* API实现说明:
*
* 该类包含基于 MessageQueue 设置和管理事件循环所需的代码。
* 影响队列状态的 APIs 应该在 MessageQueue 和 Handler 上定义,而不是在 Looper 本身上定义。
* 例如,空闲的 Handlers 和同步障碍被定义在准备线程的队列上,循环和退出则定义在 looper 上。
*/
private static final String TAG = "Looper";
// sThreadLocal.get() 将返回 null,除非你调用了 prepare()。
static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>();
private static Looper sMainLooper; // 由 Looper.class 守护
final MessageQueue mQueue;
final Thread mThread;
private Printer mLogging;
private long mTraceTag;
/**
* 若设置此值,如果消息调度花费的时间比它长,looper 将显示警告日志。
*/
private long mSlowDispatchThresholdMs;
/**
* 若设置,如果消息传递(实际传递时间 - 到达时间)花费的时间超过此时间,looper 将显示警告日志
*/
private long mSlowDeliveryThresholdMs;
/**
* 将当前线程初始化为一个 looper。
* 这使您有机会在实际启动循环之前创建引用此 looper 的 handlers。
* 一定要在调用这个方法之后调用 {@link #loop()},并通过调用 {@link #quit()} 结束它。
*/
public static void prepare() {
prepare(true);
}
private static void prepare(boolean quitAllowed) {
if (sThreadLocal.get() != null) {
throw new RuntimeException("Only one Looper may be created per thread");
}
sThreadLocal.set(new Looper(quitAllowed));
}
/**
* 将当前线程初始化为 looper,将其标记为应用程序的 main looper。
* 应用程序的 main looper 是由 Android 环境创建的,因此您永远不需要自己调用此函数。
* 另见:{@link #prepare()}
*/
pu