关于Android开发中图片的三级缓存机制
生活随笔
收集整理的這篇文章主要介紹了
关于Android开发中图片的三级缓存机制
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1.Android應(yīng)用中聯(lián)網(wǎng)加載并顯示圖片時,為了用戶體驗和節(jié)省流量,一定用到圖片的緩存。
2.關(guān)于三級緩存的理解:內(nèi)存緩存(強引用存儲)、內(nèi)存緩存(軟引用緩存)、內(nèi)存緩存(弱引用緩存)、文件緩存(就是將圖片存儲為本地文件),由此組成三級緩存。
3.關(guān)于JAVA中的對象引用,分為:強、軟、弱、虛。
4.關(guān)于JAVA的強引用與軟引用:
(1)強引用:JVM不會回收任何具有強引用的對象,內(nèi)存空間不足時,將拋出OOM異常;
(2)軟引用:在內(nèi)存不足時,JVM將會回收掉具有軟引用的對象,從而滿足程序運行的需求,以此避免出現(xiàn)OOM導(dǎo)致的程序崩潰。
5.關(guān)于LruCache類的理解:
這個類其實就是一個哈希表,存儲鍵值對。
值得注意的是:LruCache內(nèi)部存儲的圖片內(nèi)存數(shù)量超過上限以后,將采用LRU算法刪除部分圖片。LRU:Least-Recently-Used,最近最少使用算法。
Cache保存一個強引用來限制內(nèi)容數(shù)量,每當(dāng)Item被訪問的時候,此Item就會移動到隊列的頭部。當(dāng)cache已滿的時候加入新的item時,在隊列尾部的item會被回收。
6.內(nèi)存緩存部分:
(1)強引用存儲區(qū):
LruCache<String,Bitmap> cache = new LruCache<String,Bitmap>();
(2)軟引用存儲區(qū):
HashMap<String,Bitmap> softBitmapCache = new HashMap<String,SoftReference<Bitmap>>();
7.文件緩存部分:
(1)獲取本地存儲的文件名:采用MD5算法,建立URL與文件名的唯一映射關(guān)系。將從網(wǎng)絡(luò)下載的圖片文件,存儲為本地文件,命名為MD5轉(zhuǎn)換的文件名。
(2)獲取本地存儲的路徑:優(yōu)先存儲SD卡外部存儲,找不到存儲卡時,可以存儲到內(nèi)部存儲。
8.從文件緩存中獲取圖片的流程:
強引用存儲區(qū)---->軟引用存儲區(qū)---->文件存儲----->網(wǎng)絡(luò)獲取---->顯示UI
9.問題:在內(nèi)存緩存中獲取圖片時,為什么先在強引用存儲區(qū)查找,再去軟引用存儲區(qū)查找?
答:強引用存儲區(qū)存儲的圖片,有上限,超過上限將會采用LRU算法進行刪除;軟引用存儲區(qū)的圖片,在內(nèi)存不足時,JVM將會自動刪除部分圖片。
10.不同的API級別,計算Bitmap對象的內(nèi)存占用大小的代碼示例:
11.在內(nèi)存緩存中取出Bitmap對象代碼示例:
12.第一次獲取在網(wǎng)上獲取圖片文件時,存入三級緩存中的代碼示例:
2.關(guān)于三級緩存的理解:內(nèi)存緩存(強引用存儲)、內(nèi)存緩存(軟引用緩存)、內(nèi)存緩存(弱引用緩存)、文件緩存(就是將圖片存儲為本地文件),由此組成三級緩存。
3.關(guān)于JAVA中的對象引用,分為:強、軟、弱、虛。
4.關(guān)于JAVA的強引用與軟引用:
(1)強引用:JVM不會回收任何具有強引用的對象,內(nèi)存空間不足時,將拋出OOM異常;
(2)軟引用:在內(nèi)存不足時,JVM將會回收掉具有軟引用的對象,從而滿足程序運行的需求,以此避免出現(xiàn)OOM導(dǎo)致的程序崩潰。
5.關(guān)于LruCache類的理解:
這個類其實就是一個哈希表,存儲鍵值對。
值得注意的是:LruCache內(nèi)部存儲的圖片內(nèi)存數(shù)量超過上限以后,將采用LRU算法刪除部分圖片。LRU:Least-Recently-Used,最近最少使用算法。
Cache保存一個強引用來限制內(nèi)容數(shù)量,每當(dāng)Item被訪問的時候,此Item就會移動到隊列的頭部。當(dāng)cache已滿的時候加入新的item時,在隊列尾部的item會被回收。
6.內(nèi)存緩存部分:
(1)強引用存儲區(qū):
LruCache<String,Bitmap> cache = new LruCache<String,Bitmap>();
(2)軟引用存儲區(qū):
HashMap<String,Bitmap> softBitmapCache = new HashMap<String,SoftReference<Bitmap>>();
7.文件緩存部分:
(1)獲取本地存儲的文件名:采用MD5算法,建立URL與文件名的唯一映射關(guān)系。將從網(wǎng)絡(luò)下載的圖片文件,存儲為本地文件,命名為MD5轉(zhuǎn)換的文件名。
(2)獲取本地存儲的路徑:優(yōu)先存儲SD卡外部存儲,找不到存儲卡時,可以存儲到內(nèi)部存儲。
8.從文件緩存中獲取圖片的流程:
強引用存儲區(qū)---->軟引用存儲區(qū)---->文件存儲----->網(wǎng)絡(luò)獲取---->顯示UI
9.問題:在內(nèi)存緩存中獲取圖片時,為什么先在強引用存儲區(qū)查找,再去軟引用存儲區(qū)查找?
答:強引用存儲區(qū)存儲的圖片,有上限,超過上限將會采用LRU算法進行刪除;軟引用存儲區(qū)的圖片,在內(nèi)存不足時,JVM將會自動刪除部分圖片。
10.不同的API級別,計算Bitmap對象的內(nèi)存占用大小的代碼示例:
11.在內(nèi)存緩存中取出Bitmap對象代碼示例:
12.第一次獲取在網(wǎng)上獲取圖片文件時,存入三級緩存中的代碼示例:
總結(jié)
以上是生活随笔為你收集整理的关于Android开发中图片的三级缓存机制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leetcode-935-骑士拨号器-k
- 下一篇: Lua操作字符串去除回车换行以及空格