參考這個
https://mp.weixin.qq.com/s/tg96p50alrqAtRih8a3AhA
總算是弄懂了view初始化一些細(xì)節(jié)問題。
先說結(jié)論:
當(dāng)前線程只能更新該線程維護(hù)的View诈皿。
流水賬:
1.關(guān)鍵點(diǎn)在 ViewRootImpl的checkThread方法林束;
這個方法是用 mThread == Thread.currentThread() 判斷
這個mThread是什么就是關(guān)鍵了。
ViewRootImpl的構(gòu)造函數(shù)里對 mThread進(jìn)行賦值,賦值不是 mainThreadH宜U锵亍!
而是 Thread.currentThread()!!!! 所以這就很玄妙4胱蟆!避除!用Dialog.show來舉例怎披!
Dialog.show()
會調(diào)用Dialog的構(gòu)造函數(shù)
構(gòu)造器內(nèi) Window = new PhoneWindow
WindowManager 是獲取的系統(tǒng)服務(wù)Window_service
這個window進(jìn)行了 setWindowManager
5.很玄妙
new了一個WindowManagerImpl
6.回到 Dialog的show方法
最終是把view添加到decor
7.這個mWindowManager就是第5的,也就是
8.WindowManagerImpl維護(hù) 一個mGlobal
它的add方法瓶摆,完成了ViewRootImpl的初始化凉逛。
9.mGlobal是單例,沒有問題群井,
只要調(diào)用方 這個Dialog 創(chuàng)建時(真正的是Window)是在哪個線程
它的ViewRootImpl創(chuàng)建的mThread是哪個線程状飞。
假設(shè)說
Thread-4 創(chuàng)建了dialog,show
那么以后dialog里的ui操作,都應(yīng)該是Thread-4來操作诬辈,不然會checkThread失敗酵使。
Activity的操作
Activity.attach()時,
window創(chuàng)建焙糟,接下來的WindowManagerImpl創(chuàng)建口渔。
因?yàn)锳ctivity.attach是main線程,所以接下來就都是main線程了穿撮。
假如能開子線程 startActivity缺脉,接下來的操作應(yīng)該就是用那個線程去維護(hù)界面更新了。
所以悦穿,不能單純的說攻礼,不能在子線程更新UI。
比較準(zhǔn)確的說栗柒,
當(dāng)前線程只能更新該線程維護(hù)的View秘蛔。