Android面試集錦系列(33)——能講講Android的Handler機制嗎?
Android應用程式是通過訊息來驅動的,系統為每一個應用程式維護一個訊息隊例(MessageQueue),應用程式的主執行緒不斷地從這個訊息隊例中獲取訊息(Looper),然後對這些訊息進行處理(Handler),這樣就實現了通過訊息來驅動應用程式的執行。
Handler在整個Android應用中佔有很重要的地方,所以面試時我們經常要考查一下面試者是否了理解它的原理,並且能夠將大體的流程表述清楚,溝通和表達能力有時比技術能力更重要。
面試題:能講講Android的Handler機制嗎?
要講清楚Android中的訊息機制,肯定要先表述一下和Handler相關的一些類:
Message:訊息分為硬體產生的訊息(如按鈕、觸控)和軟體生成的訊息;
MessageQueue:訊息佇列的主要功能向訊息池投遞訊息(MessageQueue.enqueueMessage)和取走訊息池的訊息(MessageQueue.next);
Handler:訊息輔助類,主要功能向訊息池傳送各種訊息事件(Handler.sendMessage)和處理相應訊息事件(Handler.handleMessage);
Looper:不斷迴圈執行(Looper.loop),按分發機制將訊息分發給目標處理者。
Handler相關類的程式碼量並不大,建議大家都去看一下,網上也有很多介紹和分析這些原始碼的文章,大家自己Google一下。大家把程式碼過了一遍後,會更加深對整個過程的理解,講起來就從容多了。不建議大家為了面試去背書。
面試時,如果一個人可以清楚的表達Handler的執行機制,那麼我們接下來會主要問一下一些實際開發中注意的地方。比如會問在一個工作執行緒中建立自己的訊息隊例應該怎麼做?
其實就是想從側面驗證他是否正的瞭解,是否知道要呼叫Looper.prepare(在每個執行緒只允許執行一次)。
或者再問問是否用過HandlerThread,它有什麼優缺點等。
注意:Handler可能會引起的記憶體洩露
在Activity中像這樣建立一個Handler再正常不過了。
private final Handler handler = new Handler() { @Override public void handleMessage(Message msg) { } };
但是,其實上面的程式碼可能導致記憶體洩露,當你使用Android lint工具的話,會得到這樣的警告:
In Android, Handler classes should be static or leaks might occur, Messages enqueued on the application thread’s MessageQueue also retain their target Handler. If the Handler is an inner class, its outer class will be retained as well. To avoid leaking the outer class, declare the Handler as a static nested class with a WeakReference to its outer class
結論
諸如Handler這類耳熟能詳的概念,但其實用起來又不復雜,面試時一般會更在意對方的表達上,看對方是否能用語言有效的組織語句。最後針對一個問題,還是要用一點小的細節驗證對方是否正的做過。有些網友可能會覺得是被故意刁難,但如果面試官只提出一個問題,你說了答案後他就嗯一下就立即問下一主題,沒有和你就這個問題再擴充套件一下,你是否也會覺得他什麼都不懂,也會質疑他能否辨別出面試者的真實水平?
最後
在現在這個金三銀四的面試季,我自己在網上也蒐集了很多資料做成了文件和架構視訊資料免費分享給大家【 包括高階UI、效能優化、架構師課程、NDK、Kotlin、混合式開發(ReactNative+Weex)、Flutter等架構技術資料 】,希望能幫助到您面試前的複習且找到一個好的工作,也節省大家在網上搜索資料的時間來學習。
資料獲取方式:加入Android架構交流QQ群聊:513088520 ,進群即領取資料!!!
點選連結加入群聊【Android移動架構總群】:加入群聊

資料大全