图片开源库是一个应用非常广泛的第三方库,几乎所有的应用都会使用。目前而言常见的图片库有: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();