Android-Universal-Image-Loader的學(xué)習(xí)

Android開發(fā)中一定會遇到圖片加載迎吵,圖片緩存的問題汰聋。Universal-Image-Loader是我遇到過的比較不錯的一個開源框架恩伺,是國外一個大牛寫的,據(jù)說現(xiàn)在作者已經(jīng)不維護了铣焊,下面就源碼來學(xué)習(xí)一下逊朽,歡迎交流!

首先看源碼目錄結(jié)構(gòu)



從目錄中可見曲伊,Universal-Image-Loader(后面用UIL表示)提供了兩種緩存方式叽讳,內(nèi)存和磁盤。再來介紹一下UIL的緩存流程坟募。

還是一張圖岛蚤。



UI:請求數(shù)據(jù),使用唯一的Key值索引Memory Cache中的Bitmap懈糯。

內(nèi)存緩存:緩存搜索涤妒,如果能找到Key值對應(yīng)的Bitmap,則返回數(shù)據(jù)赚哗。否則執(zhí)行第三步届腐。

硬盤存儲:使用唯一Key值對應(yīng)的文件名铁坎,檢索SDCard上的文件蜂奸。

如果有對應(yīng)文件犁苏,使用BitmapFactory.decode*方法,解碼Bitmap并返回數(shù)據(jù)扩所,同時將數(shù)據(jù)寫入緩存围详。如果沒有對應(yīng)文件,執(zhí)行第五步祖屏。

下載圖片:啟動異步線程助赞,從數(shù)據(jù)源下載數(shù)據(jù)(Web)。

若下載成功袁勺,將數(shù)據(jù)同時寫入硬盤和緩存雹食,并將Bitmap顯示在UI中。

上面片段摘自其他技術(shù)貼期丰,應(yīng)該都是淺顯易懂群叶。不過我來追加補充了解一下,加深認(rèn)識钝荡。

首先是1的Key值街立,從代碼中看Key值如何生成。

String memoryCacheKey = MemoryCacheUtils.generateKey(uri, targetSize);

可見埠通,memoryCacheKey和圖片url本身以及要顯示的目標(biāo)大小作為唯一key赎离。就是說就算同一張圖片,只要顯示為不同尺寸端辱,也不是用的

同一個bitmap梁剔。

另外3中的從代碼查看是直接用文件名檢索而不是先通過唯一key。

聊完基本業(yè)務(wù)流程舞蔽,就來談?wù)刄IL都提供了哪些緩存算法荣病。再來看一張圖


從圖片可以看出,UIL提供的內(nèi)存緩存算法比較豐富喷鸽,有8種众雷,磁盤緩存則只有2種。下面稍微介紹一下各自算法的大致意思做祝。

1砾省、FIFOlimitedMemoryCache

先進先出的緩存策略,當(dāng)超過設(shè)定值混槐,先刪除最先加入緩存的bitmap编兄。

2、FuzzyKeyMemoryCache

這個是內(nèi)部使用声登,用于比較bitmap是否存在狠鸳,有則移除揣苏。

3、LimitedMemeryCache

使用強引用和弱引用結(jié)合的緩存策略件舵,cacheSize以內(nèi)的為強引用卸察,cacheSize以外的為弱引用。

4铅祸、LargestLimitedMemeryCache

當(dāng)超過緩存限定值坑质,先刪除最大的bitmap對象。

5临梗、LimitedAgeMemoryCache

當(dāng) bitmap加入緩存中的時間超過我們設(shè)定的值涡扼,將其刪除。

6盟庞、LRULMemoryCache

使用的LRU算法吃沪,當(dāng)有需要時最近最少使用bitmap從緩存中刪除。

7什猖、LRULimitedMemoryCache

這個也是使用的LRU算法票彪,和LruMemoryCache不同的是,他緩存加入了弱引用卸伞。cacheSize以內(nèi)的為強引用抹镊,cacheSize以外的為弱引用。

8荤傲、WeakMemoryCache

這個算法只使用了弱引用來作為緩存策略垮耳。

接下來就是磁盤緩存

imitedAgeDiscCache

設(shè)定文件存活的最長時間,當(dāng)超過這個值遂黍,就刪除該文件终佛。

UnlimitedDiscCache

這個緩存類沒有任何的限制。

介紹完上面的緩存算法之后雾家,大家是否都看到了铃彰,強引用、軟引用芯咧、弱引用等概念⊙雷剑現(xiàn)在就這三個再介紹介紹。

1.強引用

以前我們使用的大部分引用實際上都是強引用敬飒,這是使用最普遍的引用邪铲。如果一個對象具有強引用,那就類似于必不可少的生活用品无拗,垃圾回收器絕不會回收它带到。當(dāng)內(nèi)存空間不足,Java虛擬機寧愿拋出OutOfMemoryError錯誤英染,使程序異常終止揽惹,也不會靠隨意回收具有強引用的對象來解決內(nèi)存不足問題被饿。

2.軟引用(SoftReference)

如果一個對象只具有軟引用,那就類似于可有可物的生活用品搪搏。如果內(nèi)存空間足夠狭握,垃圾回收器就不會回收它,如果內(nèi)存空間不足了慕嚷,就會回收這些對象的內(nèi)存哥牍。只要垃圾回收器沒有回收它,該對象就可以被程序使用喝检。軟引用可用來實現(xiàn)內(nèi)存敏感的高速緩存。

軟引用可以和一個引用隊列(ReferenceQueue)聯(lián)合使用撼泛,如果軟引用所引用的對象被垃圾回收挠说,JAVA虛擬機就會把這個軟引用加入到與之關(guān)聯(lián)的引用隊列中。

3.弱引用(WeakReference)

如果一個對象只具有弱引用愿题,那就類似于可有可物的生活用品损俭。弱引用與軟引用的區(qū)別在于:只具有弱引用的對象擁有更短暫的生命周期。在垃圾回收器線程掃描它所管轄的內(nèi)存區(qū)域的過程中潘酗,一旦發(fā)現(xiàn)了只具有弱引用的對象杆兵,不管當(dāng)前內(nèi)存空間足夠與否,都會回收它的內(nèi)存仔夺。不過琐脏,由于垃圾回收器是一個優(yōu)先級很低的線程, 因此不一定會很快發(fā)現(xiàn)那些只具有弱引用的對象缸兔。

弱引用可以和一個引用隊列(ReferenceQueue)聯(lián)合使用日裙,如果弱引用所引用的對象被垃圾回收,Java虛擬機就會把這個弱引用加入到與之關(guān)聯(lián)的引用隊列中惰蜜。

其實UIL這個框架的代碼中可以看到很多Java的一些編程思想昂拂,設(shè)計模式等。但出于時間考慮抛猖,先寫這些格侯,后面有時間繼續(xù)補充。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末财著,一起剝皮案震驚了整個濱河市联四,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瓢宦,老刑警劉巖碎连,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異驮履,居然都是意外死亡鱼辙,警方通過查閱死者的電腦和手機廉嚼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來倒戏,“玉大人怠噪,你說我怎么就攤上這事《捧危” “怎么了傍念?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長葛闷。 經(jīng)常有香客問我憋槐,道長,這世上最難降的妖魔是什么淑趾? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任阳仔,我火速辦了婚禮,結(jié)果婚禮上扣泊,老公的妹妹穿的比我還像新娘近范。我一直安慰自己,他們只是感情好延蟹,可當(dāng)我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布评矩。 她就那樣靜靜地躺著,像睡著了一般阱飘。 火紅的嫁衣襯著肌膚如雪斥杜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天俯萌,我揣著相機與錄音果录,去河邊找鬼。 笑死咐熙,一個胖子當(dāng)著我的面吹牛弱恒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播棋恼,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼返弹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了爪飘?” 一聲冷哼從身側(cè)響起义起,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎师崎,沒想到半個月后默终,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年齐蔽,在試婚紗的時候發(fā)現(xiàn)自己被綠了两疚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡含滴,死狀恐怖诱渤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情谈况,我是刑警寧澤勺美,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站碑韵,受9級特大地震影響赡茸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜泼诱,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一坛掠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧治筒,春花似錦、人聲如沸舷蒲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽牲平。三九已至堤框,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間纵柿,已是汗流浹背蜈抓。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留昂儒,地道東北人沟使。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像渊跋,于是被迫代替她去往敵國和親腊嗡。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,851評論 2 361

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

  • 一拾酝、緩存介紹: (一)燕少、Android中緩存的必要性: 智能手機的緩存管理應(yīng)用非常的普遍和需要,是提高用戶體驗的有...
    溫暖的外星閱讀 890評論 0 12
  • UIL是一個老牌的開源圖片加載框架蒿囤,前幾年做Android開發(fā)的小伙伴肯定都非常熟悉客们。雖然現(xiàn)在UIL的作者已經(jīng)停止...
    地球是猿的閱讀 371評論 0 1
  • 整理一些常見的Android面試題(針對于2~3年開發(fā)經(jīng)驗中所遇到的問題) synchronized鎖靜態(tài)方法和非...
    appzy閱讀 2,308評論 4 18
  • 話說回家之后畫的更差了。 修改后 由于圖畫大了 葉子都畫不下了。 原圖來一張
    則魚閱讀 313評論 10 7
  • 創(chuàng)建django-app(django-blogs)目錄,目錄下包含項目開發(fā)的app(blogsplatform)...
    imsilence閱讀 601評論 0 0