o(╥﹏╥)o今天太困了,啥也不想干。就把之前收集的資料拿出來溫習(xí)一下剛好和大家共享下
創(chuàng)新互聯(lián)是一家專業(yè)提供萊西企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站設(shè)計、做網(wǎng)站、H5建站、小程序制作等業(yè)務(wù)。10年已為萊西眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡(luò)公司優(yōu)惠進行中。

之前在" 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)
負責(zé)跨線程通信,這是因為在主線程不能做耗時操作,而子線程不能更新 UI,所以當(dāng)子線程中進行耗時操作后需要更新 UI時,通過 Handler 將有關(guān) UI 的操作切換到主線程中執(zhí)行。
具體分為四大要素:
MessageQueue(消息隊列): 負責(zé)消息的存儲與管Handler.sendMessage())和處理相應(yīng)消息事件Handler.handleMessage()),按照先進先出執(zhí)行,Looper(消息池): 負責(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 MessageMessage m = Message.obtainMessage m = mHandler.obtainMessage()后兩者效果更好,因為 Android 默認的消息池中消息數(shù)量是 10,而后
兩者是直接在消息池中取出一個 Message 實例,這樣做就可以避免多
生成 Message 實例。
請查看完整的PDF版
(更多完整項目下載。未完待續(xù)。源碼。圖文知識后續(xù)上傳github。)
可以點擊關(guān)于我聯(lián)系我獲取完整PDF
(VX:mm14525201314)

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
網(wǎng)頁題目:不知廬山真面目只緣身在此山中,講解一下Handler-創(chuàng)新互聯(lián)
網(wǎng)頁鏈接:http://chinadenli.net/article36/ccgdpg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、做網(wǎng)站、標簽優(yōu)化、網(wǎng)站制作、定制開發(fā)、ChatGPT
聲明:本網(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)
猜你還喜歡下面的內(nèi)容