第一次觀看我文章的朋友,可以關注、點贊、轉發一下,每天分享各種干貨技術和程序猿趣事
前言
職場的金三銀四跳槽季又來了,不同的是今年比往年「冷」一些,形式更加嚴峻一些,大家多多少少可能都聽到或看到一些信息,就是好多公司在優化裁員,作為求職者來說,面試是一道坎,很多人會恐懼面試,即使是工作很多年的老鳥,可能仍存在面試的焦慮。
這些題目是我之前的面試去騰訊、虎牙、美團、阿里、快手等一線互聯網公司面試被問到的題目。熟悉本文中列出的知識點會大大增加通過前兩輪技術面試的幾率。
由于涉及到的面試題較多導致篇幅較長,我根據這些面試題所涉及到的常問范圍總結了并做出了一份學習進階路線圖???????及面試題答案免費分享給大家,文末有免費領取方式!
面試官:說說什么是 UI 線程?
A:就是用來刷新 UI 所在的線程嘛
面試官:多說點
A:UI 是單線程刷新的,如果多個線程可以刷新 UI 就無所謂是不是 UI 線程了,單線程的好處是,UI 框架里不需要到處上鎖,做線程同步,寫起來也比較簡單有效
面試官:你說的這個 UI 線程,它到底是哪個線程?是主線程嗎?
A:拿 Activity 來說,我們在 Activity 里異步做完耗時操作,要刷新 UI 可以調用 Activity.runOnUiThread 方法,在 UI 線程中執行,那么我們看下這個方法自然就知道 UI 線程是哪個線程了。
public final void runOnUiThread(Runnable action) {if (Thread.currentThread() != mUiThread) {mHandler.post(action);} else {action.run();}
}
這個方法會判斷當前是不是在主線程,不是呢就通過 mHandler 拋到主線程去執行。 這個 mHandler 是 Activity 里的一個全局變量,在 Activity 創建的時候通過無參構造函數 new Handler()
一起創建了。
因為是無參,所以創建時用的哪個線程,Handler 里的 Looper 用的就是哪個線程了。創建 Activity 是在應用的主線程,因此 mHandler.post 去執行的線程也是主線程。 剛也說 了,runOnUiThread 方法里,先判斷是不是在 UI 線程,這個 mUiThread 又是什么時候賦值的呢,答案還在 Activity 的源碼里
final void attach(Context context, ...) {...省略無關代碼mUiThread = Thread.currentThread();
}
在 Activity.attach 方法里,我們把當前線程賦值給 mUiThread,那當前線程是什么線程呢,也是主線程。至于為什么創建 Activity 和 attach 都是主線程,那又是另外一個故事了 通過前面的分析,我們知道了,對于 Activity 來講 UI 線程就是主線程
面試官:所以你的結論是 UI 線程就是主線程?
A:這是你說的,記住這個開發的時候不會錯,但是不夠準確。在子線程里刷新 UI 的時候會拋一個異常
ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
大意是只有最初始創建 View 層級關系的線程可以 touch view,這里指的也就是 ViewRootImpl 創建時所在的線程,嚴格來說這個線程不一定是主線程。這一點呢,讀 View.post 方法也可以得到相同的結論。所以對于 View 來說,UI 線程就是 ViewRootImpl 創建時所在的線程,Activity 的 DecorView 對應的 ViewRootImpl 是在主線程創建的
面試官:這個 ViewRootImpl 什么時候創建
A:Activity 創建好之后,應用的主線程會調用 ActivityThread.handleResumeActivity,這個方法會把 Activity 的 DecorView 添加到 WindowManger 里,就是在這個時候創建的 ViewRootImpl
面試官:那可以在異步線程刷新 View 嗎?
A:剛才我們說了,只要是 ViewRootImpl 創建的線程就可以 touch view,然后 WindowManger.addView 的時候又會去創建 ViewRootImpl,所以我們只要在子線程調用 WindowManger.addView,這個時候添加的這個 View,就只能在這個子線程刷新了,這個子線程就是這個 View 的 UI 線程了。
面試官:好,我們再聊點別的
總結:
各行各樣都會淘汰一些能力差的,不僅僅是IT這個行業,所以,不要被程序猿是吃青春飯等等這類話題所嚇倒,也不要覺得,找到一份工作,就享受安逸的生活,你在安逸的同時,別人正在奮力的向前跑,這樣與別人的差距也就會越來越遙遠,加油,希望,我們每一個人,成為更好的自己。
-
點擊此處,與我們一起交流學習
-
BAT大廠面試題、獨家面試工具包,
-
資料免費領取,包括 數據結構、Kotlin、計算機網絡、Framework源碼、數據結構與算法、小程序、NDK、Flutter
源碼、數據結構與算法、小程序、NDK、Flutter
[外鏈圖片轉存中…(img-uJCIsyaR-1619446366639)]