Android程序開發(fā)中內(nèi)存緩存優(yōu)化技巧

1系吩、什么是緩存笑诅?

緩存技術(shù)原理就是把用戶訪問的所有對(duì)象看作一個(gè)全集吐辙,經(jīng)過算法標(biāo)記哪些是用戶經(jīng)常訪問的對(duì)象宣决,把這些對(duì)象放到一個(gè)集合里,這個(gè)集合是全集一個(gè)子集昏苏,下一次用戶再訪問的時(shí)候會(huì)先從這個(gè)子集集合中查找用戶要訪問的對(duì)象如果找到就直接返回這個(gè)對(duì)象尊沸,如果沒有找到則再去全集中查找。當(dāng)然了我這里說的只是原理性的東西贤惯,緩存是有很多算法的洼专,并且有的不止一級(jí)緩存,這里就不過多講了孵构。

2屁商、為什么要用到緩存?

有緩存的話可以不必每次從源地址讀取文件颈墅,既節(jié)省了時(shí)間也節(jié)省了流量棒假。尤其是手機(jī)設(shè)備,頻繁的訪問網(wǎng)絡(luò)資源會(huì)消耗很多用戶的流量和電量精盅,這是用戶不能忍受的,所以無論從哪個(gè)方面考慮應(yīng)用程序都必須加上緩存谜酒。

3叹俏、Android中的圖片緩存有哪些?各有什么特點(diǎn)僻族?

Android設(shè)備的圖片緩存分兩種粘驰,一種是內(nèi)存緩存屡谐,圖片緩存在設(shè)備的內(nèi)存中,一種是外部緩存蝌数,圖片緩存在磁盤上愕掏,磁盤可以是內(nèi)部的存儲(chǔ)空間也可以是外部的sd卡。這兩種緩存各有各的優(yōu)點(diǎn)顶伞,內(nèi)存緩存優(yōu)點(diǎn)是快饵撑,缺點(diǎn)是因?yàn)橐彩亲x取到內(nèi)存中所以也會(huì)消耗內(nèi)存,所以不能太大唆貌,用的時(shí)候要考慮分配的空間滑潘,還有一個(gè)缺點(diǎn)是應(yīng)用重啟后就會(huì)消失。外部緩存的優(yōu)點(diǎn)是可以長(zhǎng)久保存大量的數(shù)據(jù)(相比較內(nèi)存緩存而言)锨咙,缺點(diǎn)就是慢语卤。

4、內(nèi)存緩存

在Android中官網(wǎng)推薦使用LruCache作為內(nèi)存緩存酪刀,LruCache實(shí)際上就是一個(gè)LinkedHashMap( 補(bǔ)充知識(shí):LinkedHashMap是一個(gè)雙向循環(huán)列表粹舵,不支持線程安全,LruCache對(duì)它進(jìn)行了封裝添加了線程安全操作)骂倘,里面保存了一定數(shù)量的對(duì)象強(qiáng)引用眼滤,每次添加的新對(duì)象都是在鏈表的頭,當(dāng)分配的空間用完的時(shí)候會(huì)把末尾的對(duì)象移除稠茂,移除的對(duì)象就可以被gc回收了柠偶。這里需要注意一下LruCache的容量,這個(gè)容量既不能太大睬关,會(huì)造成OOM诱担,又不能太小,起不到緩存的作用电爹。

5蔫仙、Google官網(wǎng)給出意見作為參考:

分配LruCache大小的時(shí)候考慮你的應(yīng)用剩余內(nèi)存有多大;

一次屏幕顯示多少?gòu)垐D片丐箩,有多少?gòu)垐D片是緩存起來準(zhǔn)備顯示的摇邦;

考慮你的手機(jī)分辨率和尺寸, 緩存相同的圖片個(gè)數(shù)屎勘,dpi越大的手機(jī)需要的內(nèi)存就會(huì)越大施籍;

圖片分辨率和像素質(zhì)量也決定了占用內(nèi)存的大小概漱;

圖片訪問的頻繁程度是多少丑慎,是不是有一些圖片是經(jīng)常訪問的?如果存在你可以考慮用多個(gè)·LruCache來做緩存,按照訪問的頻率度分配到不同的LruCache中竿裂;

如何平衡一下圖片質(zhì)量和數(shù)量玉吁,有些時(shí)候可以考慮緩存低分辨率的圖片,用到的時(shí)候再在后臺(tái)請(qǐng)求更高質(zhì)量的圖片腻异;

總之你分配的LruCache大小既不能太大进副,又不能太小,具體到應(yīng)用中還要你綜合考慮悔常。

下面的代碼是使用LruCache的例子:

private LruCachemMemoryCache;//聲明緩存空間

final int maxMemory = (int)(Runtime.getRuntime().maxMemory() / 1024);//獲取應(yīng)用在系統(tǒng)中的最大內(nèi)存分配

//分配1/8的應(yīng)用內(nèi)存作為緩存空間

final int cacheSize = maxMemory / 8;

mMemoryCache = new LruCache(cacheSize) {

@Override

protected int sizeOf(String key, Bitmap bitmap) {

//重寫sizeOf方法影斑,返回圖片的占用字節(jié)數(shù)而不是圖片的個(gè)數(shù),

//每次添加圖片是會(huì)被調(diào)用

return bitmap.getByteCount() / 1024;

}

};

注意:有同學(xué)可能會(huì)問下面的代碼:

int cacheSize=4*1024*1024;// 4MiB

LruCache bitmapCache=new LruCache(cacheSize){

protected int sizeOf(Stringkey,Bitmapvalue){

return value.getByteCount();

}

}

這兩個(gè)sizeOf的計(jì)算是不一樣的这嚣,這里說明一下鸥昏,這個(gè)方法重寫的目的是返回圖片占用的緩存空間而不是圖片的數(shù)目,并且這個(gè)數(shù)值的單位要和cacheSize一樣姐帚。

總結(jié):

綜合上面的講解吏垮,在使用內(nèi)存緩存LruCache時(shí)你需要知道如下知識(shí):

LruCache封裝了LinkedHashMap,提供了LRU(Least Recently Used 最近最少使用算法)緩存的功能罐旗;

LruCache通過trimToSize方法自動(dòng)刪除最近最少訪問的鍵值對(duì)膳汪;

LruCache不允許空鍵值,LinkedHashMap允許九秀;

LruCache線程安全遗嗽,LinkedHashMap線程不安全;

繼承LruCache時(shí)鼓蜒,必須要復(fù)寫sizeOf方法痹换,用于計(jì)算每個(gè)條目的大小。在put和get的時(shí)候會(huì)調(diào)用safeSizeOf(Kkey, V value)都弹,safeSizeOf(K key, V value)會(huì)調(diào)用 sizeOf (K key, V value)娇豫,這個(gè)方法默認(rèn)返回1。

本文由磨礪營(yíng)IT教育整理,向跟著威哥學(xué)習(xí)Android或java的朋友關(guān)注微信公眾號(hào)mjw-java或訪問www.moliying.com/?jianshu

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末畅厢,一起剝皮案震驚了整個(gè)濱河市冯痢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌框杜,老刑警劉巖浦楣,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異咪辱,居然都是意外死亡振劳,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門油狂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來澎迎,“玉大人庐杨,你說我怎么就攤上這事〖泄” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵仁堪,是天一觀的道長(zhǎng)哮洽。 經(jīng)常有香客問我,道長(zhǎng)弦聂,這世上最難降的妖魔是什么鸟辅? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮莺葫,結(jié)果婚禮上匪凉,老公的妹妹穿的比我還像新娘。我一直安慰自己捺檬,他們只是感情好再层,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著堡纬,像睡著了一般聂受。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上烤镐,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天蛋济,我揣著相機(jī)與錄音海诲,去河邊找鬼群扶。 笑死,一個(gè)胖子當(dāng)著我的面吹牛棠笑,可吹牛的內(nèi)容都是我干的镜悉。 我是一名探鬼主播祟辟,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼积瞒!你這毒婦竟也來了川尖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤茫孔,失蹤者是張志新(化名)和其女友劉穎叮喳,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缰贝,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡馍悟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了剩晴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锣咒。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡侵状,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出毅整,到底是詐尸還是另有隱情趣兄,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布悼嫉,位于F島的核電站艇潭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏戏蔑。R本人自食惡果不足惜蹋凝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望总棵。 院中可真熱鬧鳍寂,春花似錦、人聲如沸情龄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)刃唤。三九已至隔心,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間尚胞,已是汗流浹背硬霍。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留笼裳,地道東北人唯卖。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像躬柬,于是被迫代替她去往敵國(guó)和親拜轨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容