單張圖片加載模型
圖片加載步驟:
- 根據(jù)uri 定位到文件,本地磁盤文件嘉裤,Assert 文件郑临,res 資源文件,network 網(wǎng)絡(luò)文件等价脾;
- 從圖片文件中獲取流數(shù)據(jù)到內(nèi)存牧抵,這個過程可以叫做load;
- 對流數(shù)據(jù)進行解碼侨把,得到原始圖像數(shù)據(jù)Bitmap,這個過程叫做解碼妹孙,decode 秋柄;
- 將bitmap設(shè)置給view 顯示出來,這個過程叫display 蠢正;
注意事項:
- 圖片解碼過程中骇笔,單張圖片解碼出來的圖片數(shù)據(jù)會達到很大,甚至導(dǎo)致應(yīng)用出現(xiàn)oom的情況嚣崭,需要謹慎對待笨触;
- 圖片顯示過程中,View 的大小相對來說都是比較固定的雹舀,一張很大的圖片顯示在一個比較小的view 上面芦劣,顯示效果不但得不到提升,而且還會消耗系統(tǒng)資源说榆;
多張圖片的緩存模型
場景:
- 在界面的切換過程中虚吟,很多圖片資源是共用的寸认,我們的每一次圖片顯示都經(jīng)過load,decode串慰,display偏塞?
- 一張網(wǎng)絡(luò)圖片,上次從服務(wù)器下載下來了邦鲫,下次用到的時候灸叼,還需要從服務(wù)器download,然后load庆捺,decode怜姿,display?
解決方案:
- 對于已經(jīng)顯示過得圖片疼燥,將它存在內(nèi)存中沧卢,下次再用的時候直接從內(nèi)存中拿取醉者;不用走整個的圖片加載流程;
- 對于已經(jīng)下載過得網(wǎng)絡(luò)圖片但狭,保存在本地磁盤,再次加載的時候直接從磁盤讀取撬即,同時緩存到內(nèi)存中立磁,就不用再次從服務(wù)器下載了;
注意事項:
- 圖片緩存在內(nèi)存中剥槐,內(nèi)存的大小始終是有限的唱歧,需要控制總的內(nèi)存占用;
- 圖片緩存到磁盤粒竖,磁盤的空間是有限的颅崩,需要有效的控制磁盤占用;
UIL 框架源碼結(jié)構(gòu)
———
流程控制:
ImageLoader 入口類蕊苗;
ImageLoaderEngine 提供線程池沿后;
XXXXXTask ,Runnable 接口實現(xiàn)類朽砰,具體的流程控制類尖滚,會被丟到線程池中執(zhí)行 ;
具體的實現(xiàn):
downloader 目錄: 文件加載瞧柔,從網(wǎng)絡(luò)漆弄,本地,res 造锅,assert 加載圖片數(shù)據(jù)到內(nèi)存中撼唾;
decode 目錄:對加載進來的流數(shù)據(jù)進行解碼,得到Bitmap 數(shù)據(jù) 备绽;
display 目錄:對需要顯示的bitmap數(shù)據(jù)進行處理券坞,比如顯示倒影鬓催,圓角等;
imageaware 目錄: bitmap顯示封裝類恨锚,提供統(tǒng)一的圖片數(shù)據(jù)顯示方式宇驾;
listener 目錄:圖片加載過程的回調(diào)接口,通知流程進度和事件猴伶;
memory 目錄:內(nèi)存緩存模型课舍,提供各種策略的緩存方式;
disc 目錄:磁盤緩存模型他挎,提供各種磁盤緩存方式筝尾;
類結(jié)構(gòu)與加載模型對應(yīng)關(guān)系
類與流程
UIL 流程控制:ImageLoader 中生成Task ,提交到ImageLoaderEngine 中的線程池中執(zhí)行办桨;
具體的執(zhí)行過程:downloader -> disc ->decode ->memory->display->imageaware 筹淫;