技術(shù)匯總:第十三章:三級(jí)緩存

一級(jí)緩存

棧使用的是一級(jí)緩存, 他們通常都是被調(diào)用時(shí)處于存儲(chǔ)空間中,調(diào)用完畢立即釋放;
二級(jí)緩存

堆是存放在二級(jí)緩存中,生命周期由虛擬機(jī)的垃圾回收算法來決定(并不是一旦成為孤兒對(duì)象就能被回收),所以調(diào)用這些對(duì)象的速度要相對(duì)來得低一些。
三級(jí)緩存

三級(jí)緩存指的是:內(nèi)存緩存、本地緩存、網(wǎng)絡(luò)緩存。其各自的特點(diǎn)是內(nèi)存緩存速度快, 優(yōu)先讀取,本地緩存速度其次, 內(nèi)存沒有,讀本地,網(wǎng)絡(luò)緩存速度最慢, 本地也沒有,才訪問網(wǎng)絡(luò)。對(duì)于網(wǎng)絡(luò)緩存理解起來較為容易直接從網(wǎng)絡(luò)中獲取資源,本地緩存可以存在SD卡中,內(nèi)存緩存一般存在數(shù)組或集合中。需要在注意的是,數(shù)組和集合的生命周期依賴于它存在的activity中,因此當(dāng)程序退出,一般情況下數(shù)組和集合中的資源會(huì)被釋放。


當(dāng)我們第一次打開應(yīng)用獲取圖片時(shí),先到網(wǎng)絡(luò)去下載圖片,然后依次存入內(nèi)存緩存,磁盤緩存,當(dāng)我們再一次需要用到剛才下載的這張圖片時(shí),就不需要再重復(fù)的到網(wǎng)絡(luò)上去下載,直接可以從內(nèi)存緩存和磁盤緩存中找,由于內(nèi)存緩存速度較快,我們優(yōu)先到內(nèi)存緩存中尋找該圖片,如果找到則運(yùn)用,如果沒有找到(內(nèi)存緩存大小有限),那么我們再到磁盤緩存中去找。只要我們合理的去協(xié)調(diào)這三層緩存運(yùn)用,便可以提升應(yīng)用性能。

首先,在內(nèi)存讀數(shù)據(jù)。內(nèi)存中讀數(shù)據(jù)需要用到最近最少引用算法(lrucache)。Lrucache算法要求為new LruCache<String, Bitmap>()傳入一個(gè)分配給軟件的最大內(nèi)存,同時(shí)重寫sizeof()方法,計(jì)算每一張圖片的大小。這樣就可以直接調(diào)用LruCache的put()和get()方法。當(dāng)發(fā)現(xiàn)內(nèi)存中沒用數(shù)據(jù)是時(shí),找到SD卡中的存儲(chǔ)文件。通過Bitmap的compress()方法向文件夾中寫數(shù)據(jù),通過位圖工廠BitmapFactory的decodeStream()讀取數(shù)據(jù),同時(shí)可以為decodeStream()方法傳入options參數(shù),縮小圖片。最后如果,本地仍然沒有獲取數(shù)據(jù),在從網(wǎng)絡(luò)獲取。網(wǎng)絡(luò)獲取數(shù)據(jù)可以用異步任務(wù)來執(zhí)行(耗時(shí)操作不能再主線程中執(zhí)行)。異步任務(wù)需要重寫onPostExecute()方法和doInBackground()方法。doInBackground()方法中訪問網(wǎng)路,這里用到的是Httpurlconnection,通過連接得到輸入流,利用位圖工廠轉(zhuǎn)換成位圖,返回。onPostExecute()方法在doInBackground()方法執(zhí)行后執(zhí)行,傳入的參數(shù)數(shù)doInBackground()方法的返回值。

1、網(wǎng)絡(luò)緩存 從網(wǎng)絡(luò)獲取資源(異步加載)
2、本地緩存 從本地獲取數(shù)據(jù)(File存儲(chǔ))

3、內(nèi)存緩存 從內(nèi)存獲取數(shù)據(jù)(LruCache)