You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
1.7 KiB
83 lines
1.7 KiB
5 years ago
|
---
|
||
|
应用的 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
|
||
|
|
||
|
```
|
||
|
|