1. 程式人生 > >Handler(面試詳解)

Handler(面試詳解)

                                Handler總結多篇部落格,吸取之精華!

         一、首先先來上一段Handler的原理:

        當應用程式啟動時,Android首先會開啟一個主執行緒 (也就是UI執行緒) , 主執行緒為管理介面中的UI控制元件, 進行事件分發, 比如說, 你要是點選一個 Button ,Android會分發事件到Button上,來響應你的操作。  如果此時需要一個耗時的操作,例如: 聯網讀取資料,    或者讀取本地較大的一個檔案的時候,你不能把這些操作放在主執行緒中,如果你放在主執行緒中的話,介面會出現假死現象, 如果5秒鐘還沒有完成的話,會收到Android系統的一個錯誤提示  "強制關閉"。  這個時候我們需要把這些耗時的操作,放在一個子執行緒中,因為子執行緒涉及到UI更新,,Android主執行緒是執行緒不安全的, 也就是說,更新UI只能在主執行緒中更新,子執行緒中操作是危險的。 這個時候,Handler就出現了。,來解決這個複雜的問題 ,由於Handler執行在主執行緒中(UI執行緒中),  它與子執行緒可以通過Message物件來傳遞資料, 這個時候,Handler就承擔著接受子執行緒傳過來的(子執行緒用sedMessage()方法傳弟)Message物件,(裡面包含資料)  , 把這些訊息放入主執行緒佇列中,配合主執行緒進行更新UI。

二、基本概述


       Handler就是解決執行緒與執行緒間的通訊。
       當我們在子執行緒處理耗時操作,耗時操作完成後我們需要更新UI的時候,這就是需要使用Handler來處理了,因為子執行緒不能更  新UI,Handler能讓我們容易的把任務切換回來它所在的執行緒。

訊息處理機制本質:一個執行緒開啟迴圈模式持續監聽並依次處理其他執行緒給它發的訊息。
舉例說明:

簡單的說:一個執行緒開啟一個無限迴圈模式,不斷遍歷自己的訊息列表,如果有訊息就挨個拿出來做處理,如果列表沒訊息,自己就堵塞(相當於wait,讓出cpu資源給其他執行緒),其他執行緒如果想讓該執行緒做什麼事,就往該執行緒的訊息佇列插入訊息,該執行緒會不斷從佇列裡拿出訊息做處理。

三、Handler組成部分​   


Handler分為五部分組成:


1.Message:message就是用來執行緒直接的互動資料,可以攜帶少量資料,它有四個常用的欄位 1.what 2.age1 3.age2, 4.obj
what,age1,age2可以攜帶整行資料,obj呢就可以是任意型別。


2.Handler:handler呢就是用來發送訊息和處理訊息的,傳送訊息我們一般使用的都是Send和Post方法這個系列的方法,而這個Post一系列方法是通過Send一系列方法來實現的,而send的這些方法最後都是通過SendMessageAtTime()方法來實現的,Handler傳送一條訊息,就在訊息佇列中插一條訊息。


3.Message Queue:訊息佇列的意思,它主要用於存放所有通過Handler傳送的訊息,這部分訊息會一直儲存在訊息佇列中,等待被處理,每個執行緒裡面只能有一個Message Queue物件。
MessageQueue的,它的底層是通過單鏈表的資料結構來維護訊息列表的,它有兩個方法 enQueueMessage()和next()
enQueueMessage()主要根據時間的順序向單鏈表中插入一條訊息,next方法是一個無限迴圈的方法,如果有訊息返回這條訊息,並從連結串列中移除,如果沒有訊息的話,就一直阻塞在這裡


4.Looper:每個執行緒通過Handler傳送的訊息都儲存在MessageQueue中,Looper通過Loop()的方法就去進入一個無限迴圈當中,然後每當發現MessageQueue中存在一條訊息,就會將它取出來,並傳遞到Handler的handlermessage()方法中,每個執行緒只能有一個Looper物件。
Looper在這個迴圈中不斷的從messageQueue的next方法中獲取訊息,而next方法是一個阻塞操作,沒有訊息的時候一直處於阻塞狀態,當有訊息了通過dspatchMessage()傳送訊息給Handler物件

5.Theradlcal:messageQueue物件和Looper物件在每個執行緒中都只會有一個物件,怎麼來保證它有一個物件,就通過Threadlocal來儲存,Threadlocal是一個執行緒內部的資料儲存類,通過它可以在指定的執行緒中儲存資料,資料儲存以後只能在指定執行緒中可以獲取到儲存的資料,對於其他的執行緒來說則無法獲取到資料。

在主執行緒使用Handler的過程:
​    首先在主執行緒建立一個Handler物件 ,並重寫handleMessage()方法。然後當在子執行緒中需要進行更新UI的操作,我們就建立一個Message物件,並通過handler傳送這條訊息出去。之後這條訊息被加入到MessageQueue佇列中等待被處理,通過Looper物件會一直嘗試從Message Queue中取出待處理的訊息,最後分發會Handler的handler Message()方法中。

相關推薦

Handler面試

                                Handler總結多篇部落格,吸取之精華!          一、首先先來上一段Handler的原理:         當應用程式啟動時,Android首先會開啟一個主執行緒 (也就是UI執行緒) , 主執

jumpserver-0.3.2 堡壘機環境搭建圖文

其他 install yum mage -128 req isa 解決 qq密碼 下載安裝包:https://github.com/jumpserver/jumpserver.git 解壓 三、執行快速安裝腳本 cd /opt/jumpserver/install pip

Wireshark安裝使用及報文分析圖文

p s 技術 cap cut .net 信息 display 過程 數據 Wireshark是世界上最流行的網絡分析工具。這個強大的工具可以捕捉網絡中的數據,並為用戶提供關於網絡和上層協議的各種信息。與很多其他網絡工具一樣,Wireshark也使用pcapnetwork l

C#基礎 一方法

命名 可選參數 編譯 標記 .com 操作 改變 根據 ref 需要知道:類和方法的關系 方法和參數修飾符 自定義方法可以有或沒有參數,也可以有或沒有返回值。可以被各種關鍵字(static、virtual、public、new等)修飾以限制其行為。

CSS屬性:背景屬性圖文

顏色 開發 github上 屬性。 一起 有用 class -a 設計 本文最初發表於博客園,並在GitHub上持續更新前端的系列文章。歡迎在GitHub上關註我,一起入門和進階前端。 以下是正文。 background系列屬性 常見背景屬性 CSS樣式中,常見的背

Microsoft Power BI Desktop概念學習系列之Microsoft Power BI Desktop的下載和安裝圖文

-c gpo mic sof mage pos microsoft body 技術分享   不多說,直接上幹貨!   官網 https://powerbi.microsoft.com/zh-cn/downloads/

Fiddler Web Debugger是什麽?圖文

詳情 頁面 web客戶端 機器 代理人 博客 有用 style 攻擊     不多說,直接上幹貨! 1、為什麽是Fiddler?   抓包工具有很多,小到最常用的web調試工具firebug,達到通用的強大的抓包工具

Fiddler Web Debugger的下載和安裝圖文

下載安裝 get html lan href bug pro 人生苦短 所有       不多說,直接上幹貨!   Fiddler是一個http協議調試代理工具,它能夠記錄客戶端和服務器之間的所有 HTTP請求,可以針對特定的HTTP請

全網最詳細的跑python2.7時出現from mysql import connector ImportError: No module named mysql的問題解決辦法圖文

領域 conda load 機器學習 同時 精華 center mod con     不多說,直接上幹貨! C:\Users\lenovo>pip install mysql-connector-python-rf==2.1.3 Col

Java學習筆記54反射

pos code 重名 java學習筆記 spl catch 兩種 new fig 反射概念: java反射機制是在運行狀態中,對於任意一個類,都能知道所有屬性和方法 對於任意一個對象都能調用它的任意一個方法和屬性,這種動態獲取和調用的功能稱為java的反射機制 實際作

SPSS學習系列之SPSS Modeler怎麽修改默認的內存大小圖文

隨著 大數據 com 微信公眾 深度 內存配置 圖文 font png     不多說,直接上幹貨!  問題來源:         如果你的電腦內存配置比較低的話,會隨著數據量增加(尤其是大數據),帶不起的情況很有可能發生,會出現一些內存報

Disconf 學習系列之全網最詳細的最新穩定Disconf 搭建部署基於Ubuntu14.04 / 16.04圖文

class 6.0 conf ubuntu14 穩定 div ubun 搭建 學習   不多說直接上幹貨! https://www.cnblogs.com/wuxiaofeng/p/6882596.html (ubuntu16.04) https

Disconf 學習系列之全網最詳細的最新穩定Disconf 搭建部署基於Windows7 / 8 / 10圖文

分享 study str www windows 最新 1.8 環境 text   不多說,直接上幹貨! 工作環境以及安裝依賴軟件 Zookeeper-3.4.8 Disconf 2.6.36 Nginx 1.9.9(見如下博文的phpstu

Windows裏如何正確安裝Redis以服務運行博主推薦圖文

tex files 64位 下載 win 多說 body 網盤下載 AC     不多說,直接上幹貨!      註意 : Redis官方並沒有提供Redis的windows安裝包,但在github上, 有相關的下載地址。

分區助手是什麽?博主推薦圖文

post 操作 src 它的 公眾號 專業 分區 切割 ima     不多說,直接上幹貨!   分區助手是一個簡單易用且免費的磁盤分區管理軟件,在它的幫助下,你可以無損數據地執行調整分區大小,移動分區位置,復制分區,復制磁盤,合並分區,切割分區、恢復分

分區助手各版本比較圖文

fail str ati width weixin edi 匯聚 個人博客 ali     不多說,直接上幹貨!   分區助手擁有三個版本,專業版,綠色版和WinPE版。這裏對其的版本比較如下:   詳情,見http://www

Windows環境下執行hadoop命令出現Error: JAVA_HOME is incorrectly set Please update D:SoftWarehadoop-2.6.0confhadoop-env.cmd錯誤的解決辦法圖文

scala software ksum cal .com from 問題 jdk sun     不多說,直接上幹貨! 導讀   win下安裝hadoop  大家,別小看win下的安裝大數據組件和使用    玩過dubbo和disc

FineBI學習系列之淺談FineBI和Tableau對比異同從產品理念和功能對比圖文

研究 簡單 nio 比較 管理 post 企業it 獨立 圖片   不多說,直接上 幹貨!   FineBI和Tableau是比較好的自助式商業智能軟件,功能都很強大,是企業數據可視化不可或缺的利器,但兩款產品還是有非常大的區別的

FineBI學習系列之FineBI的Windows裏安裝後的一些配置事宜圖文

fine left text -a 得到 幹貨 圖文詳解 註冊 博客   不多說,直接上幹貨!   前期博客   第一步:需要點擊獲取激活碼     第二步:點擊註冊   註冊的

FineBI學習系列之FineBI新建儀表板圖文

功能 過程 平臺 tps RM 獲取數據 esc 表格 學習     不多說,直接上幹貨!   這是來自FineBI官網提供的幫助文檔 http://help.finebi.com/ 目錄: 1、描述 2、新建