`
liujianguangaaa
  • 浏览: 231486 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

Activity 与 Main Loope

阅读更多

上文抛出了一个疑问: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 的子类。

分享到:
评论

相关推荐

    汇编语言指令系统、伪指令

    LOOP、LOOPE/LOOPZ、LOOPNE/LOOPNZ 子程序调用与返回指令 CALL、RET 中断调用与返回指令 INT n、 IRET 串操作 指令 MOVS、CMPS、LODS、STOS、SCAS 处理器   控制   指令 标志操作指令 CLC...

    使用Puppet框架管理基础设施

    作者: James Loope 资源格式: PDF 版本: 英文文字版/更新EPUB版本/更新MOBI版本 出版社: O'Reilly书号: 978-1-4493-0763-9发行时间: 2011年06月 地区: 美国 语言: 英文 简介: 内容介绍: Automate your ...

    Calcolatori-Elettronici-polito

    IMUL DIV / IDIV 流量控制说明无条件的飞跃跳开关构造: 条件跳JE / JNE JZ / JNZ JL / JB-JG / JA JC和JO 环形: LOOPE / LOOPNE-LOOPZ / LOOPNZ 修改某些标志的值:(CF,DF,IF) 位处理说明逻辑指令和或者异或...

    汇编指令(chm格式)

    LOOPE/LOOPZ CX不为零且标志Z=1时循环. LOOPNE/LOOPNZ CX不为零且标志Z=0时循环. JCXZ CX为零时转移. JECXZ ECX为零时转移. 4&gt;中断指令 INT 中断指令 INTO 溢出中断 IRET 中断返回 5&gt;处理器控制...

    The Art of Assembly Language Programming

    INTO, BOUND, and IRET Instructions 6.9.4 - The Conditional Jump Instructions 6.9.5 - The JCXZ/JECXZ Instructions 6.9.6 - The LOOP Instruction 6.9.7 - The LOOPE/LOOPZ Instruction 6.9.8 ...

Global site tag (gtag.js) - Google Analytics