1、在checkThread()判断之前完成了对UI的操作
Activity的onCreate方法里面子线程为何能设置UI界面
- 在onCreate()的时候可以直接开启子线程更新UI,但是这是有局限性的,因为Activity的onResume之前ViewRootImpl实例没有建立,所以没有ViewRootImpl.checkThread检查,故躲避了子线程不能更新UI的异常报错
2、View的高度在修改前后保持不变
3、子线程更新UI的几种方式
- 通过runOnUiThread()方法更新UI
- 通过Handler的post()方法更新UI
- 通过Handler的sendMessage()方法
- 通过View的post()方法更新UI
- 总结:最后都有调用到Hanlder#sendMessageDelayed()方法
- ps:Handler#obtainMessage()
- 从消息池中返回了一个Message对象,如果消息池为空再创建一个新的消息
4、View.post和Handler.post的区别
-
View.post 最终也是通过 Handler.post 来执行消息的,执行过程如下:
- 如果在 performTraversals 前调用 View.post,则会将消息进行保存,之后在 dispatchAttachedToWindow 的时候通过 ViewRootImpl 中的 Handler 进行调用。
- 如果在 performTraversals 以后调用 View.post,则直接通过 ViewRootImpl 中的 Handler 进行调用。
-
mAttachInfo是ViewRootImpl首次触发performTraversals传进来的。即,触发之后,View.post通过ViewRootImpl内部的Handler进行处理;触发之前,通过RunQueue进行处理