編輯:關於Android編程
在研究源碼之前,我們對Handler的了解一般是這樣的概念:
在主線程中,有消息隊列Looper,裡面有很多的消息,還有一個Handler,用來向Looper發送消息,Looper會將消息接收,不停的取出新消息,並把消息分配給Handler執行,同時,Handler從回收的消息隊列中(Message.obtain())獲取消息進行復用,再發出新消息,這就構成了Handler的消息機制.
現在,我們就來深入分析一下這裡面的具體實現過程.
在Handler的源碼中,我們可以發現, Handler.obtainMessage() 方法的返回值,其實就是Message.obtain(),只不過每個方法的返回參數不同.
所以,在復用消息對象的時候,使用Handler.obtainMessage() 方法和Message.obtain()方法其實是相同的.而Message.obtain()的方法,都依賴空參的obtain()方法來生成數據,
所以,我們只需要研究空參的obtain方法即可.
通過查看源碼可知,空參的obtain()涉及靜態變量Message對象 mPool和非靜態的Message 對象next.說明每個消息對象都有next屬性,而mPool是所有子類共用的.
然後,我們再看Message類中的recycle()方法,也就是用來回收的方法:
在recycle()方法裡面做了一個判斷,如果mPoolSize
所以,消息回收時都做了什麼呢?我們畫圖分析一下:
每個msg對象都有一個next屬性,而所有的msg對象共用一個mPool屬性,這個前面我們已經說過.一開始的mPool值為null,recycle方法調用時,讓next=mPool,而mPool=this,把mPool指向了當前的msg對象,
這時如果再回收一個msg對象,新的msg對象的next屬性就指向了mPool,也就是上一個msg對象,而mPool指向了當前的msg對象.以此類推,就形成了回收的消息隊列.
接著我們再回到Message的obtain方法:
obtain方法判斷mPool是否為空,不為空的情況下,設置一個局部變量m,把m指向mPool也就是最新的對象
mPool指向了m的next對象,也就是上一個msg對象:
接下來將m.next賦值為null,斷開了與後面的msg對象的聯系:
然後把m給return回去,於是一條干淨的msg就被提供給Handler進行復用了.消息隊列變成了:
接下來,再判斷mPool是否為空,仍不為空的話繼續重復上面的操作.直至mPool為空時,創建一條新的消息.
也就是說,Handler在通過Message.obtain()獲取消息時,如果有消息,就復用,沒有的話,就new一條新消息.
我的微信公眾號:如果你喜歡我的文章,歡迎關注我的微信公眾號。今天給大家介紹的是一款可以動態變化的按鈕,如矩形變為圓形、圓形變為矩形、矩形先變為進度條然後再變為圓形,我們還
本文主要介紹三級緩存的原理解析與實現方式。以前一直覺得三級緩存圖片加載是一個很難理解的東西,但是自己看了一下午再試著寫了一遍之後感覺還是只要沉下心思考還時很容易熟悉掌握的
先看下利用wheelview實現滾動隨機選擇號碼效果:直接上代碼 首頁就是dialog顯示不在描述 主要看dialog代碼package com.yskj.jh.whee
兩周廢寢忘食的創作終於成功了,現在拿出來分享一下。先不說別的看一下程序運行效果圖,我沒怎麼設計ui所以界面不是很好看但是能說明問題~~~現在我們來看看實現這個功能需要些什