欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

为什么我们能在主线程直接使用 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() 是个死循环,后面的代码正常情况不会执行。