parent
f84c612f7d
commit
740ed05dda
@ -0,0 +1,82 @@ |
|||||||
|
--- |
||||||
|
应用的 UI 线程是怎么启动的? |
||||||
|
--- |
||||||
|
|
||||||
|
1. 什么是 UI 线程? |
||||||
|
2. UI 线程的启动流程,消息循环是怎么创建的 |
||||||
|
3. 了解 Android 的 UI 显示原理,UI 线程和 UI 之间是怎么关联的? |
||||||
|
|
||||||
|
#### 什么是 UI 线程? |
||||||
|
|
||||||
|
1. UI 线程就是刷新 UI 所在的线程 |
||||||
|
2. UI 是单线程刷新的 |
||||||
|
|
||||||
|
UI 线程 == 主线程? |
||||||
|
|
||||||
|
1. Activity.runOnUiThread(Runnable) |
||||||
|
2. View.post(Runnable) |
||||||
|
|
||||||
|
```java |
||||||
|
final void runOnUiThread(Runnable action) { |
||||||
|
if(Thread.currentThread() != mUiThread) { |
||||||
|
// Handler mHandler = new Handler(); |
||||||
|
mHandler.post(action); |
||||||
|
} else { |
||||||
|
action.run(); |
||||||
|
} |
||||||
|
} |
||||||
|
final void attach(Context context, ...) { |
||||||
|
mUiThread = Thread.currentThread(); |
||||||
|
} |
||||||
|
``` |
||||||
|
|
||||||
|
对 Activity 来说,UI 线程就是主线程! |
||||||
|
|
||||||
|
```java |
||||||
|
public boolean post(Runnable action) { |
||||||
|
final AttachInfo attachInfo = mAttachInfo; |
||||||
|
if(attachInfo != null) { |
||||||
|
return attachInfo.mHandler.post(action); |
||||||
|
} |
||||||
|
ViewRootImpl.getRunQueue().post(action); |
||||||
|
return true; |
||||||
|
} |
||||||
|
``` |
||||||
|
|
||||||
|
对 View 来说,它的 UI 线程就是 ViewRootImpl 创建的时候所在的线程! |
||||||
|
|
||||||
|
```java |
||||||
|
void checkThread() { |
||||||
|
if(mThread != Thread.currentThread()) { |
||||||
|
throw new CalledFromWrongThreadException(""); |
||||||
|
} |
||||||
|
} |
||||||
|
``` |
||||||
|
|
||||||
|
Activity 的 DecorView 对应的 ViewRootImpl 是在主线程创建的! |
||||||
|
|
||||||
|
**关于 UI 线程的三个结论** |
||||||
|
|
||||||
|
1. activity.runOnUiThread() |
||||||
|
|
||||||
|
对 Activity 来说,UI 线程就是主线程! |
||||||
|
|
||||||
|
2. View.post(Runnable r) |
||||||
|
|
||||||
|
对 View 来说,它的 UI 线程就是 ViewRootImpl 创建的时候所在的线程! |
||||||
|
|
||||||
|
3. checkThread() |
||||||
|
|
||||||
|
Activity 的 DecorView 对应的 ViewRootImpl 是在主线程创建的! |
||||||
|
|
||||||
|
#### UI 线程的启动流程 |
||||||
|
|
||||||
|
1. Zygote fork 进程 |
||||||
|
2. 启动 binder 线程 |
||||||
|
3. 执行入口函数 |
||||||
|
|
||||||
|
```java |
||||||
|
// ActivityThread#main |
||||||
|
|
||||||
|
``` |
||||||
|
|
Loading…
Reference in new issue