一、Bitmap內存佔用
內存大小計算
ARGB_8888
ARGB各佔8位,即WIDTH*HEIGHT*4
RGB_565
R5位,G6位,B5位,即16位 WIDTH*HEIGH*2
getByteCount
返回可用於存儲此位圖像素的最小字節數。
BitmapFactory.Options
控制解碼圖片參數
inDensity:
表示這個bitmap的像素密度,根據drawable目錄
inTargetDensity:
表示要被畫出來時的目標(屏幕)像素密度 , getResources().getDisplayMetrics().densityDpi
二、Bitmap內存壓縮
BitmapFactory.Options
inJustDecodeBounds
讀取圖片out…系列參數,如outWidth與outHeight,可用於計算內存大小
inPreferedConfig
設置圖片解碼後的像素格式,如ARGB_8888/RGB_565
inSampleSize
設置圖片解碼縮放比,如值爲4,則加載圖片寬高是原圖的1/4,內存大小則是1/16
對於內存的降低,無論是選擇jpg還是png更或者是webp。其實都是毫無意義的。Jpg是屬於有損壓縮,我們看見的jpg比png文件小,那是因爲壓縮率高。這都是屬於文件存儲範疇。對於內存來說,我們加載一張不帶alpha通道使用RGB_565格式的png與一張jpg佔用的內存大小都是一樣的。
對於內存的壓縮我們能做的就是縮小圖片尺寸與改變像素格式。
三、Bitmap內存優化
https://developer.android.google.cn/topic/performance/graphics/manage-memory.html
https://developer.android.google.cn/samples/DisplayingBitmaps/index.html
inBitmap複用
四、LruCache
android提供的一個緩存工具類,使用LRU緩存淘汰算法。
根據數據的歷史訪問記錄來進行淘汰數據, “如果數據最近被訪問過,那麼將來被訪問的機率也更高”。
1. 新數據插入到鏈表頭部;
2. 每當緩存命中(即緩存數據被訪問),則將數據移到鏈表頭部;
3. 當鏈表滿的時候,將鏈表尾部的數據丟棄。
DiskLruCache
https://github.com/JakeWharton/DiskLruCache
五、LinkedHashMap
雙向鏈表