Activity 与 Main Loope

本文通过Eclipse调试工具,逐步分析了Android应用中UI线程如何绑定Looper的过程。揭示了ActivityThread的main方法中Looper.prepareMainLooper()与Looper.loop()的作用,解释了UI线程即为主线程的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上文抛出了一个疑问:UI 线程是在哪里绑定 Looper 呢?欲解此题,仍旧从 Android 源码着手,但是 Android 的代码量是以 GB 为单位来计算的,若是一个一个来看,只见树木不见森林,未必能理出个头绪。

不妨通过 Eclipse 这一工具,设置 breakpoint,进入 debug,看一看执行流程。新建一 Android Project,创建简单的 Activity 类,在 onCreate 方法中设置断点,应用进入 debug,在断点处暂停。

以下是通过 Eclipse Debug 看到的信息:

Eclipse Debug

Eclipse Debug

从上图可以看到各个相关类的调用流程,美中不足的是缺少类的 package 信息,庆幸的是, DDMS 给出了一个更趋完美的结果,如下图:

Eclipse DDMS

Eclipse DDMS

自下向上看起,来龙去脉一目了然。结合当前问题,暂时不理会“干扰”因素,直接进入 android.app.ActivityThread,– 不必从 Reference 中查找,因为该类已经被 hidden,直接看源码,以下即为 main 方法的源码:

public static final void main(String[] args) {
    Process.setArgV0("<pre-initialized>");
 
    Looper.prepareMainLooper();
 
    ActivityThread thread = new ActivityThread();
    thread.attach(false);
 
    Looper.loop();
 
    // 以下内容省略
}

main 方法平淡无奇,和通常所见的 Java 程序一样,是一个入口。言归正题,Looper.prepareMainLooper() 是问题的切入点,那么究竟它做了什么呢?我们从文档注释中可以了解一二。

Initialize the current thread as a looper, marking it as an application’s main looper. The main looper for your application is created by the Android environment, so you should never need to call this function yourself.

注释如实反映了该方法的源码,首先调用 prepare(),为当前线程初始化 looper,而后调用 setMainLooper(),将这个 looper 设置成应用的 main looper。

public static final void prepareMainLooper() {
    prepare();
    setMainLooper(myLooper());
    if (Process.supportsProcesses()) {
        myLooper().mQueue.mQuitAllowed = false;
    }
}
 
public static final void prepare() {
    if (sThreadLocal.get() != null) {
        throw new RuntimeException("Only one Looper may be created per thread");
    }
    sThreadLocal.set(new Looper());
}
 
private synchronized static void setMainLooper(Looper looper) {
    mMainLooper = looper;
}

此时,之前的疑问也就得到了解答。现在回过头,再来看所谓的“UI 线程”,其实它就是主线程,而 ActivityThread 也并不是 Thread 的子类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值