您好,登錄后才能下訂單哦!
o(╥﹏╥)o今天太困了,啥也不想干。就把之前收集的資料拿出來溫習一下剛好和大家共享下
之前在" rel="nofollow">GitHub
上更新了些關于面試類的文章,含有從基礎到進階。含有BATJ.字節跳動面試專題,算法專題,高端技術專題,混合開發專題,java面試專題,Android,Java小知識,到性能優化.線程.View.OpenCV.NDK等應有盡有。還有輔之相關的視頻+學習筆記
(更多完整項目下載。未完待續。源碼。圖文知識后續上傳github。)
可以點擊關于我聯系我獲取完整PDF
(VX:mm14525201314)
負責跨線程通信,這是因為在主線程不能做耗時操作,而子線程不能更新 UI,所以當子線程中進行耗時操作后需要更新 UI時,通過 Handler 將有關 UI 的操作切換到主線程中執行。
具體分為四大要素:
MessageQueue
(消息隊列): 負責消息的存儲與管Handler.sendMessage()
)和處理相應消息事件Handler.handleMessage()
),按照先進先出執行,Looper
(消息池): 負責關聯線程以及消息的分發,在MessageQueue
獲取 Message,分發給Handler,Looper 創建的時候會創建一個MessageQueue
,調用 loop()
方法的時候消息循環開始,其中會不斷調用 messageQueue
的 next()方法,當有消息就處理,否則阻塞在 messageQueue
的next()方法中。當 Looper
的 quit()
被調用的時候會調用messageQueue
的 quit()
,此時 next()
會返回 null,然loop()
方法也就跟著退出。具體流程如下:
Looper
,同時也會在在Looper
內部創建一個消息隊列。而在創鍵 Handler 的Looper
,并通過該 Looper
對象獲MessageQueue.enqueueMessage
在消息隊列中添Looper.loop()
開啟消息循環不斷輪詢調用MessageQueue.next()
,取得對應的 Message 并且Handler.dispatchMessage
傳遞給 Handler,最Handler.handlerMessage
處理消息。Looper
,一個 MessageQueen
,可以有多個 HandlerThread(1)
:Looper(1)
: MessageQueue(1)
: Handler(N)
SoftReference
): 如果一個對象只具有軟引用,則WeakReference
): 如果一個對象只具有弱引用,那為什么會導致泄露:
Handler 允許我們發送延時消息,如果在延時期間用戶
關閉了 Activity,那么該 Activity 會泄露。 這個泄露
是因為 Message 會持有 Handler,而又因為 Java 的
特性,內部類會持有外部類,使得 Activity 會被
Handler 持有,這樣最終就導致 Activity 泄露。
怎么解決:
將 Handler 定義成靜態的內部類,在內部持有
Activity 的弱引用,并在 Acitivity
的 onDestroy()
中
調用 handler.removeCallbacksAndMessages(null)
及時移除所有消息。
Android 的 UI 控件不是線程安全的,如果在多線程中并發訪問
可能會導致 UI 控件處于不可預期的狀態
這時你可能會問為何系統不對 UI 控件的訪問加上鎖機制呢?因為:
Looer.loop()
方法可能會引起主線程的阻塞,但只要它的消息循環沒有被阻塞,能一直處理事件就不ANR
的不是主線程阻塞,而是主線程的 Looper
消息處理過程發生了任務阻塞,無法響應手勢操作,不能及時刷新 UI。如果隊列中只有這個消息,那么消息不會被發送,而是計算到
時喚醒的時間,先將 Looper
阻塞,到時間就喚醒它。但如果此時要加入新消息,該消息隊列的對頭跟 delay 時間相比更長,
則插入到頭部,按照觸發時間進行排序,隊頭的時間最小、隊
尾的時間最大
不可以,因為在主線程中,Activity 內部包含一個 Looper 對
象,它會自動管理 Looper
,處理子線程中發送過來的消息。而
對于子線程而言,沒有任何對象幫助我們維護 Looper
對象,所以需要我們自己手動維護。所以要在子線程開啟 Handler 要先
創建 Looper
,并開啟 Looper
循環
可以通過三種方法創建:
Message m = new Message
Message m = Message.obtain
Message m = mHandler.obtainMessage()
后兩者效果更好,因為 Android 默認的消息池中消息數量是 10,而后
兩者是直接在消息池中取出一個 Message 實例,這樣做就可以避免多
生成 Message 實例。
請查看完整的PDF版
(更多完整項目下載。未完待續。源碼。圖文知識后續上傳github。)
可以點擊關于我聯系我獲取完整PDF
(VX:mm14525201314)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。