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.
1.7 KiB
1.7 KiB
应用的 UI 线程是怎么启动的?
- 什么是 UI 线程?
- UI 线程的启动流程,消息循环是怎么创建的
- 了解 Android 的 UI 显示原理,UI 线程和 UI 之间是怎么关联的?
什么是 UI 线程?
- UI 线程就是刷新 UI 所在的线程
- UI 是单线程刷新的
UI 线程 == 主线程?
- Activity.runOnUiThread(Runnable)
- View.post(Runnable)
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 线程就是主线程!
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 创建的时候所在的线程!
void checkThread() {
if(mThread != Thread.currentThread()) {
throw new CalledFromWrongThreadException("");
}
}
Activity 的 DecorView 对应的 ViewRootImpl 是在主线程创建的!
关于 UI 线程的三个结论
-
activity.runOnUiThread()
对 Activity 来说,UI 线程就是主线程!
-
View.post(Runnable r)
对 View 来说,它的 UI 线程就是 ViewRootImpl 创建的时候所在的线程!
-
checkThread()
Activity 的 DecorView 对应的 ViewRootImpl 是在主线程创建的!
UI 线程的启动流程
- Zygote fork 进程
- 启动 binder 线程
- 执行入口函数
// ActivityThread#main