为什么我们能在主线程直接使用 Handler,而不需要创建 Looper ?

每个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() 是个死循环,后面的代码正常情况不会执行。

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值