目錄
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