UI繪制流程及原理

帶著如下幾個問題去聽課

  1. ActivityThread起到的是什么作用?
  2. Activty的生命周期oncreate 和onResume 在ui繪制流程中做了哪些事情?
  3. View是如何添加到window上面?
  4. 為什么View的更新不能在子線程?

ActivityThread起到的是什么作用

ActivtityThread是activity里面的各個生命周期方法的執(zhí)行入口。里面都是通過Handler去實現(xiàn)的。

Activty的生命周期oncreate 和onResume 在ui繪制流程中做了哪些事情?

onCreate只是把View添加到window上面,并沒有開始測量,布局。測量和布局是在onresume執(zhí)行的。
具體的源碼可以從ActivityThread的performLaunchActivity。 這里面會通過調(diào)用WindowManager.addView(decorView, params),然后通過windowManager可以一層層的追溯到ViewRootImpl。 viewRootImpl通過調(diào)用setView方法后會執(zhí)行到requestlayout方法。 requestLayout方法在往后就通過編舞者,來調(diào)用performMeasure, performLayout, perormDraw,從而達到測量,布局,繪制的目的。

View是如何添加到window上面

Activity.setContentView ------> Window.setContentView(window是一個抽你類,只有唯一的一個實例PhoneWindow)

最后就調(diào)用到了PhoneWindow.setContentView

installDecorView(創(chuàng)建頂層view為FrameLayout子類DecorView) ------> 根據(jù)不同的主題加載相應(yīng)的布局添加到頂層View上面 ------> 由于每個布局上面必定有id為android.R.id.content控件,因此setContentView的布局最后是添加到了android.R.id.content的Frame上面的。

為什么View的更新不能在子線程?

那是因為在ViewRootImpl調(diào)用 setView方法后, 里面有一個checkThread方法, 判斷了當前線程是否為主線程。 如果不是主線程,則拋出異常。因為ui更新必須在主線程里面才能完成。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容