最近在研究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)圖:
從圖中我們可以分為三層:
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)緩存。