欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

一種圖片數(shù)據(jù)緩存方法與流程

文檔序號(hào):12550896閱讀:381來源:國知局

本發(fā)明涉及計(jì)算機(jī)應(yīng)用技術(shù)領(lǐng)域,具體地說是一種圖片數(shù)據(jù)緩存方法。



背景技術(shù):

LRU,全稱Least Rencetly Used,即最近最少使用,是一種非常常用的置換算法,也即淘汰最長時(shí)間未使用的對(duì)象。LRU在操作系統(tǒng)中的頁面置換算法中廣泛使用,我們的內(nèi)存或緩存空間是有限的,當(dāng)新加入一個(gè)對(duì)象時(shí),造成我們的緩存空間不足了,此時(shí)就需要根據(jù)某種算法對(duì)緩存中原有數(shù)據(jù)進(jìn)行淘汰貨刪除,而LRU選擇的是將最長時(shí)間未使用的對(duì)象進(jìn)行淘汰。

根據(jù)LRU算法的思想,要實(shí)現(xiàn)LRU最核心的是要有一種數(shù)據(jù)結(jié)構(gòu)能夠基于訪問順序來保存緩存中的對(duì)象,這樣我們就能夠很方便的知道哪個(gè)對(duì)象是最近訪問的,哪個(gè)對(duì)象是最長時(shí)間未訪問的。LruCache選擇的是LinkedHashMap這個(gè)數(shù)據(jù)結(jié)構(gòu),LinkedHashMap是一個(gè)雙向循環(huán)鏈表,在構(gòu)造LinkedHashMap時(shí),通過一個(gè)boolean值來指定LinkedHashMap中保存數(shù)據(jù)的方式。

通過查閱LRU代碼可以知道當(dāng)accessOrder 設(shè)置為 true時(shí),每當(dāng)我們更新(即調(diào)用put方法)或訪問(即調(diào)用get方法)map中的結(jié)點(diǎn)時(shí),LinkedHashMap內(nèi)部都會(huì)將這個(gè)結(jié)點(diǎn)移動(dòng)到鏈表的尾部,因此,在鏈表的尾部是最近剛剛使用的結(jié)點(diǎn),在鏈表的頭部是是最近最少使用的結(jié)點(diǎn),當(dāng)我們的緩存空間不足時(shí),就應(yīng)該持續(xù)把鏈表頭部結(jié)點(diǎn)移除掉,直到有剩余空間放置新結(jié)點(diǎn)。

Android應(yīng)用中聯(lián)網(wǎng)加載并顯示圖片時(shí),為了用戶體驗(yàn)和節(jié)省流量,一定用到圖片的緩存,通過緩存的圖片同時(shí)也能夠快速將圖片展示到UI上,這對(duì)提升用戶體驗(yàn)有很重要的作用,但是現(xiàn)有的圖片加載方式較為落后,實(shí)用性不強(qiáng)。

因而,本發(fā)明提供一種通用數(shù)據(jù)交換接口的實(shí)現(xiàn)方法,本發(fā)明通過利用LRU算法實(shí)現(xiàn)了一種包含內(nèi)存緩存和SD卡緩存。



技術(shù)實(shí)現(xiàn)要素:

本發(fā)明的技術(shù)任務(wù)是針對(duì)以上不足之處,提供一種實(shí)用性強(qiáng)、可廣泛應(yīng)用于異構(gòu)數(shù)據(jù)集成與交換系統(tǒng)中的圖片數(shù)據(jù)緩存方法。

一種圖片數(shù)據(jù)緩存方法,通過內(nèi)存緩存和SD卡緩存來實(shí)現(xiàn)圖片緩存,其中內(nèi)存緩存包含兩個(gè)層級(jí),SD卡緩存包含一個(gè)層級(jí)的緩存,其具體實(shí)現(xiàn)過程為:

首先在內(nèi)存中開辟一塊緩存空間,該緩存通過強(qiáng)引用類型存儲(chǔ)數(shù)據(jù),該緩存空間為每個(gè)應(yīng)用分配的內(nèi)存的八分之一;

在內(nèi)存中開辟一塊二級(jí)緩存空間,通過軟引用類型,來存儲(chǔ)第一層內(nèi)存剔除出來的緩存;

然后在SD卡中建立一個(gè)目錄來存儲(chǔ)網(wǎng)絡(luò)請(qǐng)求得到的圖片數(shù)據(jù);

最后進(jìn)行數(shù)據(jù)讀取,首先讀取第一層強(qiáng)引用的緩存,通過get,即鍵值的方式看是否能夠獲取到,如果獲取不到,則讀取第二層軟引用層的緩存,當(dāng)?shù)诙訜o法獲取到緩存數(shù)據(jù)時(shí),則查詢SD卡中的緩存,三層中有一次命中即立刻返回調(diào)用者,不再向下查詢,如三層均未能命中則此時(shí)需從網(wǎng)絡(luò)請(qǐng)求資源,請(qǐng)求到之后除返回調(diào)用者外還需將請(qǐng)求到的內(nèi)容同時(shí)存入第一層緩存和第三層緩存。

所述內(nèi)存中的一級(jí)緩存空間使用LRU算法,通過軟引用類型存儲(chǔ)數(shù)據(jù),即只要存在鍵值必能夠找到對(duì)應(yīng)的實(shí)體;二級(jí)緩存空間使用LRU算法,通過軟引用類型存儲(chǔ)數(shù)據(jù),即存儲(chǔ)第一層內(nèi)存剔除出來的實(shí)體。

上述通過鍵值能夠找到對(duì)應(yīng)的實(shí)體是指在一級(jí)緩存空間中,通過鍵值獲取緩存內(nèi)容,提供移出緩存時(shí)的鍵值和緩存內(nèi)容,即通過該一級(jí)緩存空間提供,提供put、get方法,在空間中存儲(chǔ)數(shù)據(jù)的時(shí)候按照LRU算法存儲(chǔ),當(dāng)緩存中有被替換出的內(nèi)容時(shí)把被替換的內(nèi)容反映出來,以便把被替換的內(nèi)容放到下一層緩存中。

所述一級(jí)緩存空間用來存儲(chǔ)強(qiáng)引用緩存和監(jiān)聽緩存移除事件,其創(chuàng)建過程為,

首先創(chuàng)建第一層級(jí)緩存:

在該第一層緩存空間中配置內(nèi)存容量度量函數(shù)sizeOf函數(shù),保證總體占據(jù)的空間不超過設(shè)置空間:

配置entryRemoved類,用于監(jiān)聽哪個(gè)圖片資源被移除,并將移除的資源放入二級(jí)緩存:

配置一添加模塊,來添加新圖片資源到該第一層級(jí)緩存空間。

所述第二層級(jí)的緩存結(jié)構(gòu)用軟引用包裝存入的圖片資源,其創(chuàng)建過程為,

首先創(chuàng)建一個(gè)第二層級(jí)的緩存;

在該第二層級(jí)緩存空間中配置內(nèi)存容量度量函數(shù)sizeOf函數(shù),不讓總體內(nèi)存超過最大內(nèi)存。

當(dāng)向SD卡存儲(chǔ)所有從網(wǎng)絡(luò)獲取到的圖片數(shù)據(jù)時(shí),存儲(chǔ)方式通過LRU算法實(shí)現(xiàn)。

在創(chuàng)建SD卡的緩存時(shí),需要指定緩存目錄,應(yīng)用版本,緩存版本和緩存大小,所述SD卡緩存使用DiskLruCache類,由此類直接負(fù)責(zé)對(duì)空間管理。

在進(jìn)行數(shù)據(jù)讀取時(shí),通過逐層向下讀取實(shí)現(xiàn),具體為:首先從強(qiáng)引用存儲(chǔ)區(qū)獲取所需圖片數(shù)據(jù),如果命中則返回渲染UI,如果不能命中則從軟引用存儲(chǔ)區(qū)獲取,如命中則從中取出需要的數(shù)據(jù),如果仍未命中則從SD卡的緩存中獲取,當(dāng)還未命中,即都不存在時(shí)則從網(wǎng)絡(luò)獲取數(shù)據(jù)。

本發(fā)明的一種圖片數(shù)據(jù)緩存方法和現(xiàn)有技術(shù)相比,具有以下有益效果:

本發(fā)明的一種圖片數(shù)據(jù)緩存方法,通過利用LRU算法實(shí)現(xiàn)了一種包含內(nèi)存緩存和SD卡緩存,可方便快速的在UI界面展示緩存的圖片,提高用戶體驗(yàn),節(jié)省流量,實(shí)用性強(qiáng),適用范圍廣泛,易于推廣。

附圖說明

附圖1為本發(fā)明的實(shí)現(xiàn)流程圖。

具體實(shí)施方式

下面結(jié)合附圖及具體實(shí)施例對(duì)本發(fā)明作進(jìn)一步說明。

如附圖1所示,一種圖片數(shù)據(jù)緩存方法,通過內(nèi)存緩存和SD卡緩存來實(shí)現(xiàn)圖片緩存,其中內(nèi)存緩存包含兩個(gè)層級(jí),SD卡緩存包含一個(gè)層級(jí)的緩存,其具體實(shí)現(xiàn)過程為:

A: 首先內(nèi)存中開辟一塊緩存空間,大約占有每個(gè)應(yīng)用分配的內(nèi)存的八分之一,此緩存使用LRU算法,并且使用強(qiáng)引用類型存儲(chǔ)數(shù)據(jù),即只要存在的鍵值必能夠找到對(duì)應(yīng)的實(shí)體,作用是能快速取出最常使用的實(shí)體。

利用LRU算法建立一個(gè)空間有限的,可以存儲(chǔ)強(qiáng)引用的存儲(chǔ)空間。用于存儲(chǔ)從網(wǎng)絡(luò)請(qǐng)求得到的數(shù)據(jù)。

B: 在內(nèi)存中開辟一塊二級(jí)的緩存空間,此空間中可以用來存儲(chǔ)第一層內(nèi)存剔除出來的實(shí)體,此緩存使用LRU算法,與第一層級(jí)不同的是第二層級(jí)使用軟引用作為緩存,這一層級(jí)實(shí)現(xiàn)能夠做到與第一層級(jí)幾近相同的渲染速度,但是因?yàn)槭褂玫氖擒浺?,使用這段內(nèi)存的時(shí)候就不必?fù)?dān)心因?yàn)槭菑?qiáng)引用導(dǎo)致的OOM。

建立一個(gè)空間使用靈活,不影響內(nèi)存空間回收,又能夠提供內(nèi)存級(jí)別讀寫速度的緩存。用于存儲(chǔ)第一層緩存替換下來的仍有可能用到的數(shù)據(jù)。

C: 在SD卡中建立一個(gè)目錄用來存儲(chǔ)網(wǎng)絡(luò)請(qǐng)求得到的圖片數(shù)據(jù),這一層分配的空間可以比較大,因?yàn)镾D卡的空間是比較大的。同時(shí),SD卡是三個(gè)層級(jí)的緩存中速度最慢的,類似于PC中內(nèi)存和硬盤,SD卡即相當(dāng)于硬盤,特點(diǎn)是存儲(chǔ)量大,讀取速度慢,但比網(wǎng)絡(luò)快一些,并且更為穩(wěn)定。

在SD卡中開辟一個(gè)屬于本應(yīng)用的目錄空間用來存儲(chǔ)當(dāng)前應(yīng)用從網(wǎng)絡(luò)請(qǐng)求獲取到的數(shù)據(jù)信息,但是這里也不是無限制的向此空間中存儲(chǔ),只是空間大小可以設(shè)置的比較大一些。

D: 讀取的過程,首先從強(qiáng)引用存儲(chǔ)區(qū)獲取所需圖片數(shù)據(jù),如果命中則返回渲染UI,如果不能命中則從軟引用存儲(chǔ)區(qū)獲取,如命中則從中取出需要的數(shù)據(jù)。再次,仍未命中則從SD卡的緩存中獲取,最后如前面都不存在則必須從網(wǎng)絡(luò)獲取數(shù)據(jù)。

基于上述步驟,為完成Android軟件能夠?qū)崿F(xiàn)高速和空間利用率高的緩存方案,在設(shè)計(jì)上本發(fā)明完善后的步驟如下:

1)設(shè)計(jì)一個(gè)存在在內(nèi)存中的緩存,能夠?qū)崿F(xiàn)通過鍵值獲取緩存內(nèi)容,能夠提供移出緩存時(shí)的鍵值和緩存內(nèi)容的方法

這里包含的是設(shè)計(jì)一個(gè)指定大小的緩存空間,提供put,get方法,向空間中存儲(chǔ)數(shù)據(jù)的時(shí)候能夠按照LRU算法存儲(chǔ),當(dāng)緩存中有被替換出的內(nèi)容時(shí)需要把被替換的內(nèi)容反映出來,以便把被替換的內(nèi)容放到下一層緩存中。這里除了直接移除了第一層的存儲(chǔ)之外,又嘗試了存入第二層緩存,原因是此時(shí)移除的緩存內(nèi)容仍然有較大的可能性被用到,所以存入二級(jí)緩存。

2)設(shè)計(jì)一個(gè)第二層級(jí)的緩存,用于存儲(chǔ)第一層緩存。

通過第一層緩存通過替換算法替換緩存,把替換出來的鍵值和實(shí)體存到這一層緩存,目的是為了能夠更好的利用內(nèi)存空間,由于這里的緩存存儲(chǔ)的是軟引用所以不會(huì)影響系統(tǒng)對(duì)內(nèi)存資源的回收。

3)設(shè)計(jì)一個(gè)SD卡緩存,用于存儲(chǔ)所有從網(wǎng)絡(luò)獲取到的圖片數(shù)據(jù)。

SD卡的特點(diǎn)是容量大,但速度比內(nèi)存慢一些,當(dāng)網(wǎng)絡(luò)請(qǐng)求返回圖片數(shù)據(jù)的時(shí)候,立刻在這里把數(shù)據(jù)存到SD卡中,到達(dá)SD卡這里的時(shí)候,存儲(chǔ)方式同樣遵循LRU,這樣能夠使存儲(chǔ)的信息不至于過多,影響手機(jī)性能。同時(shí)鍵值對(duì)的對(duì)應(yīng)有是通過URL的MD5編碼來實(shí)現(xiàn)的。

4)讀取緩存內(nèi)容,把讀取到的緩存反饋到調(diào)用者。

讀取緩存需要逐層向下讀取,首先讀取第一層強(qiáng)引用的緩存,通過get(鍵值)的方式看是否能夠獲取到,如果獲取不到,則讀取第二層軟引用層的緩存,在這一層空間有伸縮性,如果內(nèi)存空間比較充足則可以讀取到,如果比較緊張,這里的緩存內(nèi)容也不是很多。這時(shí)需要查詢SD卡中的緩存,SD卡內(nèi)容較多,命中概率較高。三層中有一次命中即立刻返回調(diào)用者,不再向下查詢,如三層均未能命中則此時(shí)需從網(wǎng)絡(luò)請(qǐng)求資源,請(qǐng)求到之后除返回調(diào)用者外還需將請(qǐng)求到的內(nèi)容同時(shí)存入第一層緩存和第三層緩存。

現(xiàn)在以實(shí)例來進(jìn)行詳細(xì)描述,該實(shí)例是在android應(yīng)用界面開發(fā)中的實(shí)際應(yīng)用,解決應(yīng)用@互動(dòng)機(jī)制問題:

1、設(shè)計(jì)一個(gè)第一層級(jí),強(qiáng)引用的緩存,用來存儲(chǔ)強(qiáng)引用緩存和監(jiān)聽緩存移除事件。

(1)創(chuàng)建第一層級(jí)緩存:

mMemoryFirstLevelCache = new LruCache<String, Bitmap>(cacheSize)

(2)實(shí)現(xiàn)sizeOf方法,實(shí)現(xiàn)這個(gè)方法是為了保證總體占據(jù)的空間不能超過設(shè)置空間:

@Override

protected int sizeOf(String key, SoftReference<Bitmap> value) {

return super.sizeOf(key, value);

}

(3)實(shí)現(xiàn)entryRemoved方法,這里是為了監(jiān)聽哪個(gè)圖片資源被移除,這里移除的資源放入二級(jí)緩存:

@Override

protected void entryRemoved(boolean evicted, String key,

Bitmap oldValue, Bitmap newValue) {

super.entryRemoved(evicted, key, oldValue, newValue);

SoftReference<Bitmap> softReference = new SoftReference<Bitmap>(

oldValue);

mSecondMemoryCache.put(key, softReference);

}

4)實(shí)現(xiàn)添加新圖片資源到緩存空間的方法:

public void addBitmapToMemoryCache(String key, Bitmap bitmap) {

if (getBitmapFromMemoryCache(key) == null) {

mMemoryCache.put(key, bitmap);

}

}

2、設(shè)計(jì)一個(gè)第二層級(jí)的緩存結(jié)構(gòu),用軟引用包裝存入的圖片資源。

(1)創(chuàng)建一個(gè)第二層級(jí)的緩存。

mMemorySecondLevelCache = new LruCache<String, SoftReference<Bitmap>>(cacheSize)

(2)實(shí)現(xiàn)sizeOf方法,不讓總體內(nèi)存超過最大內(nèi)存。

@Override

protected int sizeOf(String key, SoftReference<Bitmap> value) {

return super.sizeOf(key, value);

}

3、設(shè)計(jì)一個(gè)SD卡的緩存方案,存儲(chǔ)網(wǎng)絡(luò)數(shù)據(jù)。

1)創(chuàng)建一個(gè)SD卡的緩存,需要指定緩存目錄,應(yīng)用版本,緩存版本和緩存大小,這里的SD卡緩存使用DiskLruCache類,由此類直接負(fù)責(zé)對(duì)空間管理:

mDiskThirdLevelCache = DiskLruCache.open(cacheDir, getAppVersion(context),1, 10 * 1024 * 1024);

4、順次讀取緩存內(nèi)容。

(1)讀取第一層緩存:

public Bitmap getBitmapFromMemoryCache(String key) {

if (mMemoryCache.get(key) == null) {

return getBitmapFromSecondMemoryCache(key);

}

return mMemoryCache.get(key);

}

(2)如果第一層為空則讀取第二層緩存:

public Bitmap getBitmapFromSecondMemoryCache(String key) {

if (mSecondMemoryCache.get(key) != null) {

return mSecondMemoryCache.get(key).get();

}

return null;

}

3)如果沒有則查詢SD卡緩存:

snapShot = mDiskLruCache.get(key);

(4)如果SD卡沒有則啟動(dòng)異步任務(wù)獲取資源,同時(shí)把請(qǐng)求結(jié)果存入第一層緩存和SD卡緩存:

CacheTask cacheTask = new CacheTask();

cacheTask.execute(imageUrl);

DiskLruCache.Editor editor = mDiskLruCache.edit(key);

if (editor != null) {

OutputStream outputStream = editor.newOutputStream(0);

if (downloadUrlToStream(imageUrl, outputStream)) {

editor.commit();

} else {

editor.abort();

}

}

通過上面具體實(shí)施方式,所述技術(shù)領(lǐng)域的技術(shù)人員可容易的實(shí)現(xiàn)本發(fā)明。但是應(yīng)當(dāng)理解,本發(fā)明并不限于上述的具體實(shí)施方式。在公開的實(shí)施方式的基礎(chǔ)上,所述技術(shù)領(lǐng)域的技術(shù)人員可任意組合不同的技術(shù)特征,從而實(shí)現(xiàn)不同的技術(shù)方案。

除說明書所述的技術(shù)特征外,均為本專業(yè)技術(shù)人員的已知技術(shù)。

當(dāng)前第1頁1 2 3 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
兰州市| 古交市| 兴文县| 黄大仙区| 永年县| 喜德县| 南华县| 循化| 永登县| 新沂市| 刚察县| 蓝田县| 霍城县| 九龙城区| 邹城市| 禹州市| 清徐县| 和龙市| 商南县| 北京市| 晋宁县| 蒙阴县| 静安区| 和平县| 富阳市| 锡林郭勒盟| 永济市| 南木林县| 宜春市| 沁源县| 彰武县| 宁津县| 咸丰县| 乾安县| 花莲县| 盈江县| 宁武县| 连南| 黄冈市| 平定县| 静乐县|