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