day 17 面試題 Handler相關

2021-09-26 09:12:52 字數 1575 閱讀 6064

面試題:

handler相關

1. 談談handler訊息機制,有什麼作用,有哪些要素,流程是怎樣的?

2. 為什麼系統不建議在子執行緒訪問ui?

3. 乙個thread可以有幾個looper?幾個handler?

4. 如何將乙個thread執行緒變成looper執行緒?looper執行緒有哪些特點?

5. 可以在子執行緒直接new乙個handler嗎?怎麼做?

6. message可以如何建立,哪種效果最好?為什麼?

7. 這裡的threadlocal有什麼作用?

8. 主線程中的looper的輪詢死迴圈為何沒有阻塞主線程?

9. 使用handler的postdealy()後訊息佇列會發生什麼變化?

標準回答

首先ui控制項是執行緒不安全的,如果多執行緒併發訪問ui控制項可能出現不可預期的狀態

那為什麼不對ui控制項加上鎖呢?

加鎖會讓ui訪問的邏輯變得更加複雜

鎖機制會降低ui訪問的效率,因為鎖會阻塞某些執行緒

鑑於以上幾點,安卓的ui訪問採用單執行緒模式來處理。如果在非ui執行緒訪問ui會丟擲calledfromwrongthreadexception異常。

由於使用了threadlocal機制,所以注定了乙個執行緒只能有乙個looper,但handler可以new無數個。

經過如下3個步驟就可以將乙個執行緒變成looper執行緒,無參構造建立的handler是和當前執行緒的looper繫結的。

looper.prepare();

handler handler = new handler();

looper.loop();

looper執行緒跟普通執行緒不一樣的是可以使用handler進行傳遞訊息。

如果是子執行緒的handler,看上乙個步驟中的邏輯

如果是建立主線程的handler,則需要傳入mainlooper

handler mainhandler = new handler(looper.getmainlooper());

建立message的三種方式:

message message = message.obtain();

message message = handler.obtainmessage();

message message = new message();

前兩種都是從訊息池中返回乙個新的例項,能有效避免重複建立message。

主要用來儲存looper,保證looper的唯一性。

主線程其實就是乙個預設實現了looper的無限迴圈的執行緒,而各個需要在主線程執行的邏輯都會通過handler來處理,messagequeue中沒有message的時候,執行緒是不會卡住的,因為什麼也沒有執行。而主線程在處理ui的操作或者activity的生命週期在執行時,如果超過一定時間就會報anr。

postdelay的message並不是等待一段時間再放入messagequeue,而是將當前message的delay時間和隊頭的message比較,按照觸發時間進行排序,到對應時間再喚醒並執行message。

Handler相關面試題

1.handler的作用 a 在非ui執行緒更新ui b 傳送延遲訊息 2.為什麼android設計只能ui執行緒更新ui?a 解決多執行緒併發問題 b 提高介面更新的效能問題 c 架構設計的簡單 3.handler相關的異常 a 只有主線程才能更新ui 解決辦法 向主線程傳送訊息,在主線程的han...

實習日記 Day17

今日份 更新 今日份流水賬 需求更新 身為乙方,每當甲方需求更新的時候,應該都很煩吧。但是我發現我自己,也許是性格使然吧,居然覺得能盡可能去滿足客戶的需求,也是一件很有成就感的事。反倒是讓我提需求的話,我會產生一種給別人添麻煩的不適感 不過這也可能是我今日份的感想,換個日子興許就不這樣想了。工具更新...

day17物件導向

1.面向過程程式設計 一遇到問題馬上想到的是怎麼用演算法或者步驟 邏輯 直接解決問題 2.函式式程式設計 一遇到問題馬上想到有沒有乙個函式具有解決這個問題的功能,如果有直接拿過來用,沒有就自己定義乙個 3.物件導向程式設計 遇到問題馬上想到有沒有乙個物件具有解決這個問題的能力,如果有直接拿過來用,沒...