首先了解為什麼需要復用池的設計?之前有說過,記憶體快取採用lrucache快取機制,在某個時刻系統會**或者當我們手動**一張記憶體中的時,就會將這張的記憶體加入到復用池中,這樣當下一次申請記憶體的時候,收錢會從復用池中查詢有沒有合適的記憶體,有的話就會復用這塊記憶體,沒有的話就會重新開闢一塊記憶體,這樣做的好處就避免了記憶體的不斷**、申請而導致的記憶體抖動和記憶體碎片。
對外提供兩個方法,如下**:
這個類是復用池的核心類,它也是使用了lrucache演算法。
1、put()方法
注意,能夠新增到復用池的必須滿足上面的條件:
(1)bmp.ismutable() 時可變的,
(2)的大小不能夠大於快取池的大小。
滿足以上條件,就可以將新增到lrucahce中,其中key為的大小,value為本身
的大小計算方式如下:
2、getbitmap()方法
首先計算當前所需要的記憶體開銷大小,然後從臨時集合中取出符合條件的快取物件,如果存在,就會從lrucache中取出這個bitmap,並移除(為了不被其他物件同時使用)。如果沒有符合的就表示不能復用復用池記憶體。
如何計算當前bitmap的記憶體大小:
比如:bitmap.config.argb_8888 ,自重a代表透明度,佔8位;r代表red,佔8位;g代表green,佔8位;b代表bule,佔8位。總共32為,為4個位元組。
1、獲取寬高
注意這裡需要將options.injustdecodebounds設定為true,這樣解析就不會耗費記憶體,並且解析的只是的邊緣資訊,儲存在options中。
2、查詢復用池
查到的話返回物件,否則返回null
3、解析、復用復用池
這裡需要注意:
(1)options.inbitmap 為null,表示重新開闢記憶體,設定為poolbmp表示復用poolbmp的記憶體
(2)options.injustdecodebounds 必須設定為false,否則解析返回的為null
(3)options.inmutable 必須設定為true,符合復用的條件
(4)options.inpreferredconfig 設定的樣式
完成上面的設定,通過decode方法就能夠解析到bitmap,並把它放入到復用池中。
4、執行結果
第一次載入,從復用池中查詢,肯定是沒有的:
再一次載入,就可以復用了:
架構師每日學習01
1.1 land攻擊 land 攻擊是一種使用相同的源和目的主機和埠傳送資料報到某台機器的攻擊。結果通常使存在漏洞的機器崩潰。1.2 ping of death攻擊 在網際網路上,ping of death是一種拒絕服務攻擊,方法是由攻擊者故意傳送大於65535位元組的ip資料報給對方。tcp ip...
系統架構師等你來學習
軟體系統架構師綜合的知識能力包括9個方面,即 1 戰略規劃能力。2 業務流程建模能力。3 資訊資料結構能力。4 技術架構選擇和實現能力。5 應用系統架構的解決和實現能力。6 基礎it知識及基礎設施 資源調配能力。7 資訊保安技術支援與管理保障能力。8 it審計 治理與基本需求分析 獲取能力。9 面向...
架構師學習筆記13 開發管理
70 的失敗軟體專案是因為管理不善,而不是技術。技術只會影響到區域性。加強專案管理,可以控制財務成本 提高資源利用率 改進客戶關係,縮短開發時間,降低成本,提高利潤 生產率 產品質量和可靠性,完善公司內部協調等。軟體開發管理分為 軟體範圍管理 軟體進度管理 軟體成本管理 軟體配置管理 軟體質量管理 ...