o(╥﹏╥)o今天太困了,啥也不想干。就把之前收集的資料拿出來溫習(xí)一下剛好和大家共享下
新洲網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項目制作,到程序開發(fā),運營維護。成都創(chuàng)新互聯(lián)自2013年創(chuàng)立以來到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)。
之前在" rel="nofollow">GitHub
上更新了些關(guān)于面試類的文章,含有從基礎(chǔ)到進階。含有BATJ.字節(jié)跳動面試專題,算法專題,高端技術(shù)專題,混合開發(fā)專題,java面試專題,Android,Java小知識,到性能優(yōu)化.線程.View.OpenCV.NDK等應(yīng)有盡有。還有輔之相關(guān)的視頻+學(xué)習(xí)筆記
(更多完整項目下載。未完待續(xù)。源碼。圖文知識后續(xù)上傳github。)
可以點擊關(guān)于我聯(lián)系我獲取完整PDF
(VX:mm14525201314)
負(fù)責(zé)跨線程通信,這是因為在主線程不能做耗時操作,而子線程不能更新 UI,所以當(dāng)子線程中進行耗時操作后需要更新 UI時,通過 Handler 將有關(guān) UI 的操作切換到主線程中執(zhí)行。
具體分為四大要素:
MessageQueue
(消息隊列):負(fù)責(zé)消息的存儲與管Handler.sendMessage()
)和處理相應(yīng)消息事件Handler.handleMessage()
),按照先進先出執(zhí)行,Looper
(消息池):負(fù)責(zé)關(guān)聯(lián)線程以及消息的分發(fā),在MessageQueue
獲取 Message,分發(fā)給Handler,Looper 創(chuàng)建的時候會創(chuàng)建一個MessageQueue
,調(diào)用 loop()
方法的時候消息循環(huán)開始,其中會不斷調(diào)用 messageQueue
的 next()方法,當(dāng)有消息就處理,否則阻塞在 messageQueue
的next()方法中。當(dāng) Looper
的 quit()
被調(diào)用的時候會調(diào)用messageQueue
的 quit()
,此時 next()
會返回 null,然loop()
方法也就跟著退出。具體流程如下:
Looper
,同時也會在在Looper
內(nèi)部創(chuàng)建一個消息隊列。而在創(chuàng)鍵 Handler 的Looper
,并通過該 Looper
對象獲MessageQueue.enqueueMessage
在消息隊列中添Looper.loop()
開啟消息循環(huán)不斷輪詢調(diào)用MessageQueue.next()
,取得對應(yīng)的 Message 并且Handler.dispatchMessage
傳遞給 Handler,最Handler.handlerMessage
處理消息。Looper
,一個 MessageQueen
,可以有多個 HandlerThread(1)
:Looper(1)
: MessageQueue(1)
: Handler(N)
SoftReference
):如果一個對象只具有軟引用,則WeakReference
):如果一個對象只具有弱引用,那為什么會導(dǎo)致泄露:
Handler 允許我們發(fā)送延時消息,如果在延時期間用戶
關(guān)閉了 Activity,那么該 Activity 會泄露。 這個泄露
是因為 Message 會持有 Handler,而又因為 Java 的
特性,內(nèi)部類會持有外部類,使得 Activity 會被
Handler 持有,這樣最終就導(dǎo)致 Activity 泄露。
怎么解決:
將 Handler 定義成靜態(tài)的內(nèi)部類,在內(nèi)部持有
Activity 的弱引用,并在 Acitivity
的 onDestroy()
中
調(diào)用 handler.removeCallbacksAndMessages(null)
及時移除所有消息。
Android 的 UI 控件不是線程安全的,如果在多線程中并發(fā)訪問
可能會導(dǎo)致 UI 控件處于不可預(yù)期的狀態(tài)
這時你可能會問為何系統(tǒng)不對 UI 控件的訪問加上鎖機制呢?因為:
Looer.loop()
方法可能會引起主線程的阻塞,但只要它的消息循環(huán)沒有被阻塞,能一直處理事件就不ANR
的不是主線程阻塞,而是主線程的 Looper
消息處理過程發(fā)生了任務(wù)阻塞,無法響應(yīng)手勢操作,不能及時刷新 UI。如果隊列中只有這個消息,那么消息不會被發(fā)送,而是計算到
時喚醒的時間,先將 Looper
阻塞,到時間就喚醒它。但如果此時要加入新消息,該消息隊列的對頭跟 delay 時間相比更長,
則插入到頭部,按照觸發(fā)時間進行排序,隊頭的時間最小、隊
尾的時間最大
不可以,因為在主線程中,Activity 內(nèi)部包含一個 Looper 對
象,它會自動管理 Looper
,處理子線程中發(fā)送過來的消息。而
對于子線程而言,沒有任何對象幫助我們維護 Looper
對象,所以需要我們自己手動維護。所以要在子線程開啟 Handler 要先
創(chuàng)建 Looper
,并開啟 Looper
循環(huán)
可以通過三種方法創(chuàng)建:
Message m = new Message
Message m = Message.obtain
Message m = mHandler.obtainMessage()
后兩者效果更好,因為 Android 默認(rèn)的消息池中消息數(shù)量是 10,而后
兩者是直接在消息池中取出一個 Message 實例,這樣做就可以避免多
生成 Message 實例。
請查看完整的PDF版
(更多完整項目下載。未完待續(xù)。源碼。圖文知識后續(xù)上傳github。)
可以點擊關(guān)于我聯(lián)系我獲取完整PDF
(VX:mm14525201314)
網(wǎng)頁題目:不知廬山真面目只緣身在此山中,講解一下Handler
鏈接URL:http://chinadenli.net/article44/ihshee.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、電子商務(wù)、外貿(mào)建站、品牌網(wǎng)站制作、網(wǎng)站策劃、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)