1.什么是UI线程?
2.UI线程的启动流程,消息循环是怎么创建的?
3.了解Android的UI显示原理,UI线程和UI之间是怎么关联的?
UI线程就是刷新UI所在的线程,UI是单线程刷新的(多线程的话UI框架就需要到处加锁很容易出问题)
很多人理解的UI线程就是主线程,要做耗时操作时会在子线程中处理,处理完之后再回到UI线程刷新UI
有这2种方式:Activity.runOnUiThread(Runnable)和View.post(Runnable)
mHandler是Activity的一个全局变量,在Activity创建时一起创建的,mUiThread是在Activity调用attch函数时创建的
mAttachInfo是在ViewTree第一次绘制时,会递归的给所有的子View都赋上一个AttachInfo,它是在ViewRootImpl构造函数里创建的,AttachInfo里的mHandler对应的就是ViewRootImpl对象创建时所在的线程。当attachInfo为空时也就是说ViewRootImpl还没创建呢,也就是说Activity的onResume回调还没有执行,当在onCreate方法里调用view的post函数时,是把它先扔到View的mRunQueue(HandlerActionQueue)里,等到ViewRootImpl初始化完成再
丢到ViewRootImpl所在的线程里去执行。
每欠requestLayout时都会去checkThread一下,如果创建ViewRootImpl的线程mThread会和当前线程去对比,如果不一致就会抛下面的异常。
DecorView是整个界面的最顶层View,对于Activity或它的DecorView来说UI线程就是主线程。
addView里面会创建ViewRootImpl对象,setView函数是设置的View能不能显示的关键一步。也就是说addView函数所在的线程也就是ViewRootImpl所在的线程。
假如在子线程中添加一个View,在主线程中去刷新它则会报下面红色的错。
对应用来说,UI线程就是主线程,入口函数就是ActivityThread的main函数
prepareMainLooper是不允许调用的,sThreadLocal是线程私有的一个Map,sMainLooper是一个静态变量,应用启动时这个sMainLooper就已经设置好了,不能重复创建。主线程的Looper也是不允许退出的,普通线程的Looper是可以退出的。
网友评论