日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

浅谈Handler机制

發(fā)布時間:2023/12/18 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 浅谈Handler机制 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Android中Handler是一個十分重要的東西,很多時候都需要用到Handler。那什么是Handler呢?又為什么要用Handler呢?

什么是Handler?

我們知道Android更新UI的操作必須放到主線程中來進行,那么問題來了,假如你有現(xiàn)在需要下載一張圖片并顯示到Activity中,假如這張圖片跟大,需要下載很長時間。如果你直接放到Activity主線程中下載,那么會造成頁面卡死(因為主線程一直在等下載完圖片),我們知道,如果一個頁面超過5S沒有響應(yīng)會發(fā)生ANR錯誤,因此你會想到開一個線程去下載圖片,那么問題又來了,你下載完圖片不能直接更新UI,怎么把你下載圖片加載到主線程中呢?Handler就是來解決問題的,Handler是線程間通信傳遞數(shù)據(jù)的有力工具。

Handler的用途?

Handler一般有兩種用途:1)執(zhí)行計劃任務(wù),你可以再預(yù)定的實現(xiàn)執(zhí)行某些任務(wù),可以模擬定時器。2)線程間通信。在Android的應(yīng)用啟動時,會 創(chuàng)建一個主線程,主線程會創(chuàng)建一個消息隊列來處理各種消息。當(dāng)你創(chuàng)建子線程時,你可以再你的子線程中拿到父線程中創(chuàng)建的Handler對象,就可以通過該 對象向父線程的消息隊列發(fā)送消息了。由于Android要求在UI線程中更新界面,因此,可以通過該方法在其它線程中更新界面。

Handler運行機制?

Android中有一種消息隊列的說法,可以這樣理解,如果一個隧道就是消息隊列的話,那么進隧道的每一輛汽車,不考慮超車的情況,那么先進隧道的車會先出,公路上的汽車就相當(dāng)于一個Message,每一輛汽車都有各自的屬性,攜帶了不同的東西,Looper想當(dāng)于隧道出口的收費站,對每一輛經(jīng)過隧道的汽車進行識別和處理,最終交給Handler去根據(jù)汽車?yán)锩鏀y帶的東西做不同的處理。這就類似于我們接下來將要說的Handler機制。


(主線程中會自動生成這樣的一個消息隊列,輔助線程中則沒有)

Handler的工作原理?

在使用Handler之前,你必須先明確幾個概念:Looper、Thread、Message、MessageQueue和Handler的運行機制。

Handler 工作流程基本包括 Handler、Looper、Message、MessageQueue 四個部分。但我們在日常開發(fā)中,經(jīng)常都只會用到 Handler 和 Message 兩個類。


1、Message 負(fù)責(zé)消息的搭載,里面有個 target 用于標(biāo)記消息,obj 用于存放內(nèi)容,Handler 負(fù)責(zé)消息的分發(fā)和處理。
2、Looper:(相當(dāng)于隧道) 一個線程可以產(chǎn)生一個Looper 對象,由它來管理此線程里的Message Queue( 車隊,消息隧道) 。
3、Handler: 你可以構(gòu)造Handler 對象來與Looper 溝通,以便(Handler)push 新消息到Message Queue 里;或者接收Looper( 從Message Queue 取出) 所送來的消息。
4、Message Queue( 消息隊列): 用來存放線程放入的消息。
5、線程:UI thread 通常就是main thread ,而Android 啟動程序時會替它建立一個Message Queue 。

每一個線程里可含有一個Looper 對象以及一個MessageQueue 數(shù)據(jù)結(jié)構(gòu)。在你的應(yīng)用程序里,可以定義Handler 的子類別來接收Looper 所送出的消息。

Android中Handler、Looper、Message、MessageQueue之間的關(guān)系?

Handler、Looper、Message、MessageQueue這四者的關(guān)系,用比較通俗的方式解釋,可以理解為:Looper是傳送帶在不停的運送貨物,MessageQueue是傳送帶上面的貨物隊列,Message就是貨物隊列中一個一個的貨物,而Handler則是貨物被消費的地方。用一張圖片來理解


在這里可以把傳送帶上的貨物看做是一個一個Message,而承載這些貨物的傳送帶就是裝Message的MessageQueue,傳送機依靠滾輪帶動起來轉(zhuǎn)動,這里把傳送機滾輪看做是Looper,滾輪轉(zhuǎn)動需要電源,這里的Thread用來供電,這里可以看出,所有的消息循環(huán)的一切操作都是基于某個線程,一切準(zhǔn)備就緒,只需按下電源開關(guān),這里的開關(guān)就是Looper.loop();此時Looper就會驅(qū)動著消息隊列循環(huán)起來,那么Handler在整套傳送機制中充當(dāng)什么身份呢?Handler就相當(dāng)于放入貨物或者取出貨物的管道(即圖中的入口與出口),將貨物放入入口管道 相當(dāng)于調(diào)用了handler.sendMessageXXX(),postXXX(),sendEmptyMessageXXX方法

將貨物從出口管道取出時,相當(dāng)于調(diào)用了handler.dispatchMessage()方法,該方法中我們完成了對Message的處理。

本篇博客只是簡單的介紹的一下Handler,之后會再發(fā)布一篇博客對Handler的工作流程進行詳解

May everyone be happy every day and everything go well!

總結(jié)

以上是生活随笔為你收集整理的浅谈Handler机制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。