目錄

Handler相關

一.談一談你對handler的認識,例如:機制和實現等。

handler機制圖解:

handler常見使用過程:

handler機制:

二.一個線程中最多有多少個Handler,Looper,MessageQueue?

三.Looper死循環為什麼不會導致應用卡死,會耗費大量資源嗎?

四.系統為什麼不建議子線程中更新UI?

五.如何處理Handler使用不當造成的內存泄漏?

六.如何創建Message實例?

七.Handler的消息優先級,有什麼應用場景?

八.主線程的Looper何時退出?能否手動退出?

九.什麼是Handler的同步屏障機制?

十.既然可以存在多個Handler往MessageQueue中添加數據(發送消息時各個Handler可能處於不同線程),那它內部是如何確保線程安全的?

十一.使用Handler的postDelay或者sendMessageDelayed後消息隊列有什麼變化?

十二.什麼是IdleHandler?

十三.MessageQueue 提供了 add/remove IdleHandler 的方法,是否需要成對使用?

十四.當 mIdleHanders 一直不為空時,為什麼不會進入死循環?

十五.是否可以將一些不重要的啓動服務,搬移到 IdleHandler 中去處理?

十六.IdleHandler 的 queueIdle() 運行在那個線程?

十七.IdleHandler的使用場景?

Handler在系統以及第三方框架的一些應用

一.什麼是HandlerThread?

二.IntentService怎麼實現線程切換的?

三.談一談你對AsynTask的認識。

常見面試題:

Handler相關 一.談一談你對handler的認識,例如:機制和實現等。 handler機制圖解:

handler常見使用過程: ①.子線程向主線程發送消息:

在主線程中新建Handler實例,並重寫handleMessage()方法用於處理子線程傳過來的message; 通過Message.obtain()方法獲取到消息msg,然後將需要傳遞給主線程的信息通過msg的what、obj等字段傳遞; 通過handler的sendMessage發送msg消息,然後在handleMessage中處理消息。 ②.主線程向子線程發送消息:

主要多了第一步中在新建Handler實例之前需要調用Looper.prepare();新建實例之後需要調用Looper.loop();最後子線程應該主動安全退出調用looper.quitSafely()方法;其他步驟和上面一致。 handler機制: ①.第一步調用Looper.prepare()方法:

如果有Looper則直接報錯,如果沒有則創建Looper並且存儲在ThreadLocal中; 在Looper的構造方法中可以看見創建MessageQueue實例,此處可以看出一個線程對應一個Looper對應一個MessageQueue。 主線程中不需要執行此步驟是因為在ActivityThread.main中已經調用了此方法。

②.新建handler實例並且重寫handleMessage()方法處理消息,創建Handler對象主要有以下幾個內容:

創建Handler對象 得到當前線程的Looper對象,並判斷是否為空 讓創建的Handler對象持有Looper、MessageQueue、Callback的引用 ③.調用Looper.loop()用於啓動消息隊列中的for輪詢,消息隊列中有消息就立馬取出通過msg.target.dispatchMessage分發到Handler中處理消息,處理消息handleMessage方法優先級最低,如果沒重寫前面兩個Callback就會走到handleMessage中處理消息。

④.通過Message.obtain()方法獲取到消息msg,此處obtain()方法是嘗試從消息池中拿消息,如果沒有拿到就新建消息。

⑤.通過handler發送消息,不管是sendMessage()方法還是post()等方法本質都是:把Message加入到Handler中的MessageQueue中去。

二.一個線程中最多有多少個Handler,Looper,MessageQueue? ————————————————

版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。

全文鏈接:https://blog.csdn.net/gongjdde/article/details/121800079