上文抛出了一个疑问:UI 线程是在哪里绑定 Looper 呢?欲解此题,仍旧从 Android 源码着手,但是 Android 的代码量是以 GB 为单位来计算的,若是一个一个来看,只见树木不见森林,未必能理出个头绪。
不妨通过 Eclipse 这一工具,设置 breakpoint,进入 debug,看一看执行流程。新建一 Android Project,创建简单的 Activity 类,在 onCreate 方法中设置断点,应用进入 debug,在断点处暂停。
以下是通过 Eclipse Debug 看到的信息:
Eclipse Debug
从上图可以看到各个相关类的调用流程,美中不足的是缺少类的 package 信息,庆幸的是, 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 的子类。
分享到:
相关推荐
《循环与分支设计在汇编语言程序中的应用》 在计算机科学中,循环与分支设计是编程的基础元素,尤其在汇编语言编程中显得尤为重要。汇编语言是一种低级编程语言,它直接对应于计算机的机器指令,因此理解和掌握循环...
例如,`AND AH, CL`是逻辑与操作,将AH寄存器的值与CL寄存器的值进行按位与运算;`OR BL, 30H`则是逻辑或操作,将BL寄存器的值与30H进行按位或;`NOT AX`是对AX寄存器的值进行逻辑非运算,反转所有位;`SHR DX, CL`...
LOOP、LOOPE/LOOPZ、LOOPNE/LOOPNZ 子程序调用与返回指令 CALL、RET 中断调用与返回指令 INT n、 IRET 串操作 指令 MOVS、CMPS、LODS、STOS、SCAS 处理器 控制 指令 标志操作指令 CLC...
例如,指令"AND AH, CL"将AH寄存器的每一位与CL寄存器对应位进行与运算,结果存储回AH。 实验内容中还提到了三种循环控制指令:LOOP、LOOPE和LOOPNE。这些指令用于根据CX寄存器的值来决定循环的执行情况。LOOP指令...
循环与分支程序设计是计算机程序设计中的基础概念,它们允许我们根据特定条件执行代码的不同路径或者重复执行一段代码直到满足特定条件。以下是对这些概念的详细解释: **循环控制指令**: 在8086处理器中,循环...
LOOPZ/LOOPE与LOOPNZ/LOOPNE指令 **LOOPZ/LOOPE(循环直到零/相等)** LOOPZ或LOOPE指令是在条件满足时继续循环的控制指令。这里的“Z”代表Zero,“E”代表Equal,当循环计数器CX不为0且ZF(零标志)置位时(即...
8. 循环控制指令LOOPE的使用:介绍LOOPE/LOOPZ等指令如何基于CX寄存器的内容来控制循环的执行,包括何时转移至目标地址或顺序执行。 9. 8086与8088微处理器的差异:尽管两者内部结构基本相同,但8088允许8位外部...
`LOOPE/LOOPZ`和`LOOPNE/LOOPNZ`分别在`ZF`(零标志)为真或为假时决定是否继续循环。 - `JCXZ`:当CX寄存器的值为0时,执行无条件转移,常用于简单的计数循环。 4. **调用和返回指令**: - `CALL`:调用子程序,...
3. **子程序调用与返回指令**:子程序调用指令如`CALL`,会保存当前的返回地址(通常是PC的下一个值),然后将程序执行转移到子程序的地址。执行完子程序后,`RET`指令会恢复并跳转回原来的返回地址,实现子程序的...
在汇编语言中,循环的控制可通过专门的循环指令,如LOOP、LOOPZ/LOOPE、LOOPNZ/LOOPNE,以及配合CX寄存器和跳转指令来实现。 以显示BX寄存器中二进制数的十六进制形式为例,我们可以看到汇编程序设计的实际应用。这...
- **控制转移指令**:包括无条件转移指令 JMP、条件转移指令 JCC/JCXZ、循环指令 LOOP/LOOPE/LOOPNE、过程调用指令 CALL、子过程返回指令 RET、中断指令 INTn、INT3、INTO、IRET 等。 - **串操作指令**:用于对数据...
- LOOP, LOOPE, LOOPNE:循环控制,`LOOP address`当CX非零时继续循环。 5. 其他特殊指令 - CALL和RET:子程序调用和返回,`CALL address`调用子程序,`RET`返回到调用点。 - INT和IRET:中断处理,`INT`触发...
使用循环指令(LOOP、LOOPZ、LOOPE等)来简化重复操作的编写。 - **子程序与堆栈管理**:学会定义和调用子程序,掌握参数传递的方式以及如何正确管理堆栈空间。 #### 三、高级应用 - **中断和异常处理**:了解...
汇编语言程序设计第七章-循环结构程序(与“数据”相关共44张) 本章节主要介绍汇编语言程序设计中的循环结构程序,包括循环结构程序的提出、组成、循环控制指令、数据串操作指令、循环程序的控制方法、单重循环...
- `LOOP` / `LOOPE` / `LOOPNE` / `JCXZ` / `JECXZ`:循环控制指令。 - `JMP` / `CALL` / `RET` / `RETF`:转移与返回指令。 ### 其他指令 1. **中断与异常处理指令**: - `INT`:软件中断指令。 - `INTO`:...
例如,`INC`用于加一,`ADD`用于加法,`SHR`用于右移,`LOOPE`是循环控制指令,`JG`、`JE`、`JMP`是条件跳转指令,用于控制程序流程。 6. **程序执行分析**:题目给出了几组指令序列,要求分析执行后的结果。这些...
《使用Puppet框架管理基础设施》这本书由James Loope编写,通过一系列代码示例和真实案例来介绍如何使用Puppet这一流行的配置管理框架自动化计算系统。本书适用于对系统管理和Ruby语言有一定了解的读者,帮助他们...
同时,MASM 6.x提供了循环控制伪指令如LOOPE,简化了循环结构的实现。循环结构通常包含初始化、循环体、循环条件控制和修改部分,确保循环能够正确终止。 总的来说,IBM-PC汇编语言中的循环与分支程序设计是通过...