为什么我们能在主线程直接使用 Handler,而不需要创建 Looper ?
程序员文章站
2022-05-25 23:47:51
...
每个Handler 的线程都有一个 Looper ,主线程当然也不例外,但是我们不曾准备过主线程的 Looper 而可以直接使用,这是为何?
通常我们认为 ActivityThread 就是主线程。事实上它并不是一个线程,而是主线程操作的管理者。所以把 ActivityThread 认为就是主线程无可厚非。下面通过代码来看一下ActivityThread里面的main方法:
2 public static void main(String[] args) {
3 //...
4 Looper.prepareMainLooper();
5
6 ActivityThread thread = new ActivityThread();
7 thread.attach(false);
8
9 if (sMainThreadHandler == null) {
10 sMainThreadHandler = thread.getHandler();
11 }
12 //...
13 Looper.loop();
14
15 throw new RuntimeException("Main thread loop unexpectedly exited");
16 }
在main方法里面,调用 了Looper.prepareMainLooper()方法,接着看下prepareMainLooper:
public static void prepareMainLooper() {
prepare(false);
synchronized (Looper.class) {
if (sMainLooper != null) {
throw new IllegalStateException("The main Looper has already been prepared.");
}
sMainLooper = myLooper();
}
}
可以看到在 ActivityThread 里 调用了 Looper.prepareMainLooper() 方法创建了 主线程的 Looper ,并且调用了 loop() 方法,所以我们就可以直接使用 Handler 了。
Looper.loop() 是个死循环,后面的代码正常情况不会执行。