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