handler消息機制原理 面試:Handler的工作原理是怎樣的?
面試:Handler的工作原理是怎樣的?處理機制的工作原理:處理程序的工作流程主要包括處理程序、循環(huán)器、消息和消息隊列四個部分。但是在我們的日常開發(fā)中,我們通常只使用處理程序和消息類。Message負(fù)
面試:Handler的工作原理是怎樣的?
處理機制的工作原理:
處理程序的工作流程主要包括處理程序、循環(huán)器、消息和消息隊列四個部分。但是在我們的日常開發(fā)中,我們通常只使用處理程序和消息類。Message負(fù)責(zé)承載消息,其中有一個用于標(biāo)記消息的目標(biāo)、用于存儲內(nèi)容的obj以及用于分發(fā)和處理消息的處理程序。
以下是對您的具體說明:
處理程序機制由循環(huán)器和消息隊列構(gòu)成。
消息隊列:消息隊列。雖然它被稱為隊列,但實際上它的內(nèi)部存儲結(jié)構(gòu)并不是一個真正的隊列。相反,它使用單鏈表的數(shù)據(jù)結(jié)構(gòu)來存儲消息列表。主要有兩種方法:insert enqueue()和remove next()。
循環(huán)器:消息循環(huán)。消息隊列用于存儲消息,而looper用于確定無限循環(huán)中是否有新消息。如果有新消息,將對其進(jìn)行處理。如果沒有,它將是備用的。當(dāng)線程創(chuàng)建處理程序時,它首先需要創(chuàng)建一個循環(huán)器,否則它將報告一個錯誤:runtimeException:no looper活套準(zhǔn)備()未在此線程上調(diào)用,每個線程中只需要創(chuàng)建一個循環(huán)器,否則將報告錯誤:runtimeException:每個線程只能創(chuàng)建一個循環(huán)器。
在面試中,我建議自己總結(jié)一套自己的專屬答案,并徹底理解,這樣當(dāng)我遇到這個問題時,我就可以輕松回答了
handler機制的原理?
處理程序主要用于異步消息處理:消息發(fā)送時,首先進(jìn)入消息隊列,發(fā)送消息的函數(shù)立即返回,另一部分在消息隊列中逐個取出消息,然后對消息進(jìn)行處理,即,發(fā)送和接收消息不同步。這種機制通常用于處理相對耗時的操作。
1、處理程序的定義:
主要接受子線程發(fā)送的數(shù)據(jù),并用這些數(shù)據(jù)更新主線程的UI。
說明:當(dāng)應(yīng)用程序啟動時,Android將首先打開一個主線程(即UI線程)。主線程是管理界面中用于分發(fā)事件的UI控件。例如,如果您單擊一個按鈕,Android將向該按鈕分發(fā)事件以響應(yīng)您的操作。如果此時需要一個耗時的操作,例如從Internet讀取數(shù)據(jù)或讀取大型本地文件,則不能將這些操作放在主線程中。如果將它們放在主線程中,接口將假裝死亡。如果在5秒鐘內(nèi)還沒有完成,您將收到來自Android系統(tǒng)的錯誤提示“強制關(guān)機”。此時,我們需要將這些耗時的操作放到子線程中,因為子線程涉及UI更新。Android主線程不是線程安全的,也就是說,更新UI只能在主線程中進(jìn)行,而在子線程中的操作是危險的。此時,處理程序出現(xiàn)。為了解決這個復(fù)雜的問題,由于處理程序在主線程(UI線程)中運行,它和子線程可以通過消息對象傳遞數(shù)據(jù)。此時,處理程序負(fù)責(zé)接受子線程傳遞的消息對象(包含數(shù)據(jù))(子線程通過sedmessage()方法傳遞消息對象),將這些消息放入主線程隊列,并與主線程協(xié)作更新UI。
2、處理程序的一些特性
處理程序可以將消息對象和可運行對象分發(fā)到主線程。處理程序的每個實例都將綁定到創(chuàng)建它的線程(通常位于主線程中)。它有兩個功能:
(1)安排消息或runnable在主線程中的某個位置執(zhí)行;
(2)安排要在不同線程中執(zhí)行的操作。
3、處理程序?qū)嵗?/p>
子類需要繼承Hendler類并重寫handlemessage(message MSG)方法以接受線程數(shù)據(jù)。