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