ImageLoader源碼解析-----ImageLoader的結(jié)構(gòu)

最近在研究ImageLoader的源碼骆莹,希望能分享出自己的思路颗搂。具體源碼移步Github下載:https://github.com/nostra13/Android-Universal-Image-Loader
我們先不急著對(duì)源碼進(jìn)行講解担猛,如果有什么失誤請(qǐng)大家留言探討幕垦,我們先來(lái)了解一下ImageLoader的相關(guān)類依賴簡(jiǎn)略結(jié)構(gòu)圖:

Paste_Image.png

從圖中我們可以分為三層:
1:UI層。
2:加載展示邏輯層:各種配置傅联、LoadTask先改、DisplayTask。
3 :獲取圖片數(shù)據(jù)層蒸走。

下面我們來(lái)介紹一下ImageLoader中的類:

入口控制類:
ImageLoader:入口類仇奶,作為整個(gè)框架的入口控制類,使用的是單列模式比驻。
配置類
ImageLoaderConfiguration:提出ImageLoader的配置该溯。使用的是建造者模式。
DefaultConfigurationFactory:ImageLoaderConfiguration的默認(rèn)配置工廠類别惦。使用靜態(tài)的工廠模式狈茉。
DisplayImageOptions:包含一些圖片展示的選項(xiàng):比如圖片加載失敗、加載中掸掸、異常展示的圖片氯庆。建造者模式。
ImageLoadingInfo:圖片加載中的信息類扰付。封裝一些key堤撵、展示View、DisplayImageOptions羽莺、圖片加載監(jiān)聽(tīng)器和過(guò)程監(jiān)聽(tīng)器等实昨。
任務(wù)類:
ImageLoaderEngine:所有需要異步加載線程池執(zhí)行線程的曹組都通過(guò)該類完成。
DisplayBitmapTask:通過(guò)執(zhí)行這個(gè)任務(wù)顯示加載好的Bitmap圖片盐固。
ProcessAndDisplayImageTask:內(nèi)存換成獲取到Bitmap的情況下屠橄,需要后處理器處理的時(shí)候調(diào)用的任務(wù)。即為:options.shouldPostProcess()成立時(shí)調(diào)用闰挡。
LoadAndDisplayImageTask:加載圖片流和展示調(diào)用的Task.

以下類按照包路徑分批:
com.nostra13.universalimageloader.core.download(下載器模塊):
ImageDownloader:圖片下載器定義的接口锐墙,并定義好枚舉類型和返回InputStream的方法。通過(guò)這個(gè)方法我們知道长酗,ImageLoader框架支持:HTTP("http")溪北、HTTPS("https")、FILE("file"), CONTENT("content")、ASSETS("assets")之拨、DRAWABLE("drawable"),六種協(xié)議茉继。
BaseImageDownloader:實(shí)現(xiàn)了ImageDownloader完成了各種協(xié)議獲取InputStream的實(shí)現(xiàn)。

com.nostra13.universalimageloader.core.decode(圖片流的解碼器模塊):
ImageDecodingInfo:解碼圖片流過(guò)程中用到的數(shù)據(jù)蚀乔。
ImageDecoder:定義圖片解碼流的接口烁竭。通過(guò)傳入的ImageDecodingInfo把流轉(zhuǎn)換成Bitmap.
BaseImageDecoder:ImageDecoder的實(shí)現(xiàn)類。

com.nostra13.universalimageloader.core.imageaware(包裝類)
ImageAware:包裝展示類,比如ImageView的接口吉挣,擴(kuò)展一些方法派撕。定義獲取寬高、獲取ViewScaleType類型睬魂、獲取封裝對(duì)象 getWrappedView终吼,是否回收isCollected、獲取IDgetId氯哮、setImageDrawable际跪、setImageBitmap。
ViewAware:實(shí)現(xiàn)ImageAware接口的抽象類喉钢。使用弱引用包裝一個(gè)Android的View姆打。
NonViewAware:實(shí)現(xiàn)ImageAware接口的抽象類,定義不需要依賴View展示的方法。這個(gè)一般方法使用只下載圖片的情況下肠虽。
ImageViewAware:實(shí)現(xiàn)ViewAware抽象方法幔戏。重現(xiàn)一個(gè)ImageView特有的操作。

com.nostra13.universalimageloader.core.listener(監(jiān)聽(tīng)器)
ImageLoadingListener:圖片正在加載的監(jiān)聽(tīng)器舔痕,定義開(kāi)始评抚、失敗、完成伯复、取消的放慨代。
ImageLoadingProgressListener:圖片加載進(jìn)度監(jiān)聽(tīng)器,定義onProgressUpdate方法啸如。
SimpleImageLoadingListener:實(shí)現(xiàn)空的ImageLoadingListener方法侍匙。
PauseOnScrollListener:監(jiān)聽(tīng)快速滾動(dòng)的時(shí)候暫時(shí)加載。

com.nostra13.universalimageloader.core.assist(幫助類)
ViewScaleType:View縮放類型叮雳。
QueueProcessingType:任務(wù)處理類型想暗。先進(jìn)先出還是后進(jìn)先出。
LoadedFrom:加載類型帘不。網(wǎng)絡(luò)说莫、本地、內(nèi)存寞焙。
ImageSize:圖片大小储狭。
ImageScaleType:圖片縮放的類型互婿。
FlushedInputStream:解決慢網(wǎng)絡(luò)的流問(wèn)題。
FailReason:失敗原因辽狈。
ContentLengthInputStream:封裝返回流慈参。
com.nostra13.universalimageloader.core.assist.deque:隊(duì)列。

下面我們來(lái)說(shuō)一下核心的本地緩存和內(nèi)存緩存的分類算法:

com.nostra13.universalimageloader.cache.memory(內(nèi)存緩存)
MemoryCache:定義內(nèi)存緩存方法的接口刮萌。
BaseMemoryCache:基本行為的抽象類驮配。實(shí)現(xiàn)簡(jiǎn)單的設(shè)置、獲取着茸、刪除壮锻、清理內(nèi)存對(duì)象和獲取所有keys的方法。暴露引用的抽象類元扔。
LimitedMemoryCache:限制內(nèi)存大小的抽象類躯保。

WeakMemoryCache:實(shí)現(xiàn)BaseMemoryCache抽象類使用軟引用策略旋膳。
FuzzyKeyMemoryCache:實(shí)現(xiàn)BaseMemoryCache澎语,如果設(shè)置key之前遍歷,如果cache存在验懊,就先刪除再設(shè)置擅羞。

UsingFreqLimitedMemoryCache:實(shí)現(xiàn)LimitedMemoryCache,記錄使用次數(shù)义图,如果超過(guò)限制的大小减俏,就刪除使用最少的。
FIFOLimitedMemoryCache:實(shí)現(xiàn)LimitedMemoryCache碱工,使用先進(jìn)先出算法娃承,用列表保存Bitmap列表,刪除時(shí)刪除0的先怕篷。
LargestLimitedMemoryCache:實(shí)現(xiàn)LimitedMemoryCache历筝,記錄位圖的大小,超出刪除最大的位圖廊谓。
LRULimitedMemoryCache:實(shí)現(xiàn)LimitedMemoryCache梳猪,最近最少使用算法。使用LinkedHashMap的特性蒸痹,找出最長(zhǎng)時(shí)間沒(méi)有使用的Bitmap并刪除春弥,弱引用。

LruMemoryCache:實(shí)現(xiàn)MemoryCache叠荠,最近最少使用算法匿沛。強(qiáng)引用。

com.nostra13.universalimageloader.cache.disc(硬盤(pán)緩存)
DiskCache:定義緩存的接口

com.nostra13.universalimageloader.cache.disc.naming(文件名生成器)
FileNameGenerator:定義接口
HashCodeFileNameGenerator:用URL生成hashcode碼轉(zhuǎn)字符串榛鼎。
Md5FileNameGenerator:用MD5加載URL生成唯一key.

com.nostra13.universalimageloader.cache.disc.impl(硬盤(pán)緩存實(shí)現(xiàn)):
BaseDiskCache:抽象類逃呼。
UnlimitedDiskCache:實(shí)現(xiàn)BaseDiskCache公给,不錯(cuò)任何限制。
LimitedAgeDiskCache:實(shí)現(xiàn)BaseDiskCache蜘渣,超時(shí)刪除淌铐。

LruDiskCache:最近最少使用算法實(shí)現(xiàn)硬盤(pán)緩存。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蔫缸,一起剝皮案震驚了整個(gè)濱河市腿准,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拾碌,老刑警劉巖吐葱,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異校翔,居然都是意外死亡弟跑,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)防症,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)孟辑,“玉大人,你說(shuō)我怎么就攤上這事蔫敲∷撬裕” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵奈嘿,是天一觀的道長(zhǎng)貌虾。 經(jīng)常有香客問(wèn)我,道長(zhǎng)裙犹,這世上最難降的妖魔是什么尽狠? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮叶圃,結(jié)果婚禮上袄膏,老公的妹妹穿的比我還像新娘。我一直安慰自己盗似,他們只是感情好哩陕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著赫舒,像睡著了一般悍及。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上接癌,一...
    開(kāi)封第一講書(shū)人閱讀 51,198評(píng)論 1 299
  • 那天心赶,我揣著相機(jī)與錄音,去河邊找鬼缺猛。 笑死缨叫,一個(gè)胖子當(dāng)著我的面吹牛椭符,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播耻姥,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼销钝,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了琐簇?” 一聲冷哼從身側(cè)響起蒸健,我...
    開(kāi)封第一講書(shū)人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎婉商,沒(méi)想到半個(gè)月后似忧,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡丈秩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年盯捌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蘑秽。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡饺著,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出筷狼,到底是詐尸還是另有隱情瓶籽,我是刑警寧澤匠童,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布埂材,位于F島的核電站,受9級(jí)特大地震影響汤求,放射性物質(zhì)發(fā)生泄漏俏险。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一扬绪、第九天 我趴在偏房一處隱蔽的房頂上張望竖独。 院中可真熱鬧,春花似錦挤牛、人聲如沸莹痢。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)竞膳。三九已至,卻和暖如春诫硕,著一層夾襖步出監(jiān)牢的瞬間坦辟,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工章办, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留锉走,地道東北人滨彻。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像挪蹭,于是被迫代替她去往敵國(guó)和親亭饵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,079評(píng)論 25 707
  • 本文出自《Android源碼設(shè)計(jì)模式解析與實(shí)戰(zhàn)》中的第一章梁厉。 1冬骚、優(yōu)化代碼的第一步——單一職責(zé)原則 單一職責(zé)原則的...
    MrSimp1e0閱讀 1,766評(píng)論 1 13
  • 來(lái)澳洲半年了,日子越發(fā)的平淡與孤獨(dú)懂算。 一日上課只冻,童年打的一款網(wǎng)絡(luò)游戲突然闖入記憶,那時(shí)我有一個(gè)心愿计技,制作一把自己心...
    自在山人閱讀 231評(píng)論 0 0
  • 地點(diǎn):監(jiān)獄餐廳人物:杰森喜德、盧克情節(jié):杰森和盧克在餐廳用餐之際,女獄警朵恩前來(lái)詢問(wèn)他們打算參加什么課程注釋:本內(nèi)容選...
    心翱翔閱讀 451評(píng)論 0 2