Android-Universal-Image-Loader使用介紹

圖片開源庫是一個應用非常廣泛的第三方庫,幾乎所有的應用都會使用。目前而言常見的圖片庫有:Android-Universal-Image-Loader,Picasso,Fresco,Glide等,下面是國內Top500Android應用分析報告中對圖片開源庫使用情況的統計表

ImageLoader使用比例

由此可見在國內應用中,UIL是使用最廣泛的圖片開源庫。接下來就簡單介紹這個UIL的基本使用,該項目的Github地址鏈接:https://github.com/nostra13/Android-Universal-Image-Loader
一.UIL的功能特性
1、多線程異步加載和顯示圖片(網絡圖片、sd卡、資源文件(asset,mipmap等,不能加載9patch),新增加載視頻縮略圖)
2、支持加載過程的監聽,可以暫停加載圖片,在經常使用的ListView、GridView中,可以設置滑動時暫停加載,停止滑動時加載圖片(便于節約流量,在一些優化中可以使用)
3、高度可定制化(可以根據自己的需求進行各種配置,如:線程池,圖片下載器,內存緩存策略等)
4、支持圖片的內存緩存,SD卡(文件)緩存
執行原理:每一個圖片的加載和顯示任務都運行在獨立的線程中,除非這個圖片緩存在內存中,這種情況下圖片會立即顯示。如果需要的圖片緩存在本地,他們會開啟一個獨立的線程隊列。如果在緩存中沒有正確的圖片,任務線程會從線程池中獲取,因此,快速顯示緩存圖片時不會有明顯的障礙。(別人那邊借鑒的這段)
流程圖:

二、使用方法
1、Include library
我們都知道使用第三方庫的第一步就是引入jar文件,這里有如下幾種方式來引入jar文件。
1)、 下載jar文件并拷入lib文件夾。Download JAR
2)、Maven dependency:

3)、Gradle dependency:

compile'com.nostra13.universalimageloader:universal-image-loader:1.9.5'

2、添加相關權限,一般為訪問網絡的權限和訪問內存的權限
3、下面我們就來開始看如何使用這個圖片異步加載庫:
1)、先要配置ImageLoaderConfiguration這個類實現全局ImageLoader的實現情況。
一般在Application中初始化設置該類。

//獲取緩存文件
File cacheDir = StorageUtils.getCacheDirectory(this);
//設置自定義緩存的目錄
cacheDir = StorageUtils.getOwnCacheDirectory(this,"imageloader/Cache");
//初始化ImageLoad
ImageLoaderConfiguration config =newImageLoaderConfiguration.Builder(this)
.memoryCacheExtraOptions(480,800)//設置緩存圖片的默認尺寸,一般取設備的屏幕尺寸
.diskCacheExtraOptions(480,800, null)
.threadPoolSize(3)// 線程池內加載的數量,default = 3
.threadPriority(Thread.NORM_PRIORITY-2)
.tasksProcessingOrder(QueueProcessingType.FIFO)
.denyCacheImageMultipleSizesInMemory()
.memoryCache(newLruMemoryCache(2*1024*1024))//自定義內存的緩存策略
.memoryCacheSize(2*1024*1024)
.memoryCacheSizePercentage(13)// default
.diskCache(newUnlimitedDiskCache(cacheDir))// default
.diskCacheSize(50*1024*1024)
.diskCacheFileCount(100)//緩存的文件數量
.diskCache(newUnlimitedDiskCache(cacheDir))//自定義緩存路徑
.diskCacheFileNameGenerator(newHashCodeFileNameGenerator())// default
.imageDownloader(newBaseImageDownloader(this))// default
.imageDecoder(newBaseImageDecoder(true))// default
.defaultDisplayImageOptions(DisplayImageOptions.createSimple())// default
.writeDebugLogs()
.build();

以上的配置看個人需求進行選擇,不是所有都要進行配置。
配置好ImageLoaderConfiguration后,調用以下方法來實現初始化

ImageLoader.getInstance().init(config);

2)、加載圖片
在使用ImageLoader進行圖片加載的時候,先要實例化ImageLoader,在每個布局里面都要實例化后再使用,實例化的方法有如下幾種:

protectedImageLoader imageLoader = ImageLoader.getInstance();

之后進行顯示的圖片的各種格式DisplayImageOptions的設置:

mOptions=newDisplayImageOptions.Builder()
.showImageOnLoading(R.mipmap.ic_launcher)//設置圖片在下載期間顯示的圖片
.showImageForEmptyUri(R.mipmap.ic_launcher)//設置圖片Uri為空或是錯誤的時候顯示的圖片
.showImageOnFail(R.mipmap.ic_launcher)//設置圖片加載/解碼過程中錯誤時候顯示的圖片
.cacheInMemory(true)//設置下載的圖片是否緩存在內存中
.cacheOnDisk(true)//設置是否緩存在SD卡中
.considerExifParams(true)//是否考慮JPEG圖像EXIF參數(旋轉,翻轉)
.imageScaleType(ImageScaleType.EXACTLY_STRETCHED)//設置圖片的縮放類型
.bitmapConfig(Bitmap.Config.ARGB_4444)//設置圖片的解碼類型
//.decodingOptions(null)  //設置Bitmap的配置選項
.resetViewBeforeLoading(true)//設置圖片在下載前是否重置,復位
.displayer(newRoundedBitmapDisplayer(100))//是否設置為圓角,弧度為多少
.displayer(newFadeInBitmapDisplayer(100))//是否圖片加載好后漸入的動畫時間
.build();

在上面配置中,并不是所有的配置都是我們需要的,在實際使用中我們只需要配置我們需要的就可以,下面簡單介紹兩個最常用的配置:
imageScaleType(ImageScaleType imageScaleType)是設置圖片的縮放方式,其中縮放方式有如下幾種:
EXACTLY :圖像將完全按比例縮小的目標大小
EXACTLY_STRETCHED:圖片會縮放到目標大小完全
IN_SAMPLE_INT:圖像將被二次采樣的整數倍
IN_SAMPLE_POWER_OF_2:圖片將降低2倍,直到下一減少步驟,使圖像更小的目標大小
NONE:圖片不會調整
displayer(BitmapDisplayer displayer)是設置圖片的顯示方式
顯示方式displayer:
RoundedBitmapDisplayer(introundPixels)設置圓角圖片
FakeBitmapDisplayer()這個類什么都沒做
FadeInBitmapDisplayer(intdurationMillis)設置圖片漸顯的時間
SimpleBitmapDisplayer()正常顯示一張圖片
3)、使用ImageLoad來顯示圖片
(1). 加載一張網絡圖片

ImageLoader.getInstance().displayImage(imageUrl, imageView);

(2)、加載一張網絡圖片并自定義配置

ImageLoader.getInstance().displayImage("http://img5.imgtn.bdimg.com/it/u=3218480149,1328367548&fm=21&gp=0.jpg",mImageView,mOptions);

(3)、加載一張圖片并對圖片的加載過程進行監聽

ImageLoader.getInstance().displayImage("http://img5.imgtn.bdimg.com/it/u=3218480149,1328367548&fm=21&gp=0.jpg",mImageView2,mOptions, newImageLoadingListener() {
@Override
public voidonLoadingStarted(String imageUri,View view) {
//開始加載
}
@Override
public voidonLoadingFailed(String imageUri,View view,FailReason failReason) {
//加載失敗
}
@Override
public voidonLoadingComplete(String imageUri,View view,Bitmap loadedImage) {
//加載完成
}
@Override
public voidonLoadingCancelled(String imageUri,View view) {
//取消加載
}
});

(4)、圖片加載時候,帶監聽又帶加載進度條的情況調用:

imageLoader.displayImage(imageUrl, imageView, options,newImageLoadingListener() {
@Override
publicvoidonLoadingStarted() {
//開始加載的時候執行
}
@Override
publicvoidonLoadingFailed(FailReason failReason) {
//加載失敗的時候執行
}
@Override
publicvoidonLoadingComplete(Bitmap loadedImage) {
//加載成功的時候執行
}
@Override
publicvoidonLoadingCancelled() {
//加載取消的時候執行
},newImageLoadingProgressListener() {
@Override
publicvoidonProgressUpdate(String imageUri, View view,intcurrent,inttotal) {
//在這里更新 ProgressBar的進度信息
}
});

三、注意事項
1、ImageLoaderConfiguration必須配置并且全局化的初始化這個配置ImageLoader.getInstance().init(config); 否則會出現錯誤提示
2、ImageLoader是根據ImageView的height,width確定圖片的寬高。
3、如果經常出現OOM(官方的建議)
①減少配置之中線程池的大小,(.threadPoolSize).推薦1-5;
②使用.bitmapConfig(Bitmap.config.RGB_565)代替ARGB_8888;
③使用.imageScaleType(ImageScaleType.IN_SAMPLE_INT)或者 try.imageScaleType(ImageScaleType.EXACTLY);
④避免使用RoundedBitmapDisplayer.他會創建新的ARGB_8888格式的Bitmap對象;
⑤使用.memoryCache(new WeakMemoryCache()),不要使用.cacheInMemory();

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,362評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,577評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,486評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,852評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,600評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,944評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,944評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,108評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,652評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,385評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,616評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,111評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,798評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,205評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,537評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,334評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,570評論 2 379

推薦閱讀更多精彩內容