一、介绍
(一)、概要:
Android-Universal-Image-Loader是一个开源的UI组件程序,该项目的目的是实现可重复使用的异步图像加载、缓存和显示。所以,如果你的程序里需要这个功能的话,使用它,因为已经封装好了一些类和方法。其实,写一个这方面的程序还是比较麻烦的,要考虑多线程,缓存,内存溢出等很多方面。
(二)、功能概要:
(三)、不仅用于加载网络图片,还可以加载本地图片。
String imageUri = "http://site.com/image.png"; // from Web
String imageUri = "file:///mnt/sdcard/image.png"; // from SD card
String imageUri = "content://media/external/audio/albumart/13"; // from content provider
String imageUri = "assets://image.png"; // from assets
String imageUri = "drawable://" + R.drawable.image; // from drawables (only images, non-9patch)
二、基本使用
(一)、使用步骤:
1、下载jar包universal-image-loader-x.x.x-with-sources.jar并导入工程
2、配置Manifest文件,添加网络请求和访问外部存储的权限,因为要进行网络请求和本地缓存
3、实现自定义的MyApplication类,并初始化ImageLoader,注意要在Manifest的Application标签注明
android:name=".MyApplication",否则还是使用的默认的Application类。
【 核心代码 】
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
.threadPriority(Thread.NORM_PRIORITY - 2)
.denyCacheImageMultipleSizesInMemory()
.discCacheFileNameGenerator(new Md5FileNameGenerator())
.tasksProcessingOrder(QueueProcessingType.LIFO)
.enableLogging() // Not necessary in common
.build();
ImageLoader.getInstance().init(config);
}
}
【 备注 】
ImageLoaderConfiguration 配置中的.discCacheFileNameGenerator()方法是将缓存下来的文件的命名,可以调用的方法有:
1)、new Md5FileNameGenerator() //使用MD5对UIL进行加密命名
2)、new HashCodeFileNameGenerator()//使用HASHCODE对UIL进行加密命名
4、配置图片显示选项——DisplayImageOptions 的设置:
【 核心代码 】
DisplayImageOptions options;
options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.ic_launcher) //设置图片在下载期间显示的图片
.showImageForEmptyUri(R.drawable.ic_launcher) //设置图片Uri为空或是错误的时候显示的图片
.showImageOnFail(R.drawable.ic_launcher) //设置图片加载/解码过程中错误时候显示的图片
.cacheInMemory(true) //设置下载的图片是否缓存在内存中
.cacheOnDisc(true) //设置下载的图片是否缓存在SD卡中
.considerExifParams(true) //是否考虑JPEG图像EXIF参数(旋转,翻转)
.imageScaleType(ImageScaleType.EXACTLY_STRETCHED) //设置图片以如何的缩放类型
.bitmapConfig(Bitmap.Config.RGB_565) //设置图片质量——解码类型
.decodingOptions(android.graphics.BitmapFactory.Options decodingOptions) //设置图片的解码配置
//.delayBeforeLoading(int delayInMillis)//int delayInMillis为你设置的下载前的延迟时间
//设置图片加入缓存前,对bitmap进行设置
//.preProcessor(BitmapProcessor preProcessor)
.resetViewBeforeLoading(true) //设置图片在下载前是否重置,复位
.displayer(new RoundedBitmapDisplayer(20)) //是否设置为圆角,弧度为多少
.displayer(new FadeInBitmapDisplayer(100)) //是否图片加载好后渐入的动画时间
.build(); //构建完成
【 备注 】
以上配置中:
1)、imageScaleType(ImageScaleType imageScaleType) 是设置图片的缩放方式
缩放类型mageScaleType有:
EXACTLY :图像将完全按比例缩小到目标大小
EXACTLY_STRETCHED:图片会缩放到目标大小完全
IN_SAMPLE_INT:图像将被二次采样的整数倍
IN_SAMPLE_POWER_OF_2:图片将降低2倍,直到下一减少步骤,使图像更小的目标大小
NONE:图片不会调整
2)、displayer(BitmapDisplayer displayer) 是设置图片的显示方式
显示方式displayer有:
RoundedBitmapDisplayer(int roundPixels)设置圆角图片
FakeBitmapDisplayer()这个类什么都没做
FadeInBitmapDisplayer(int durationMillis)设置图片渐显的时间
SimpleBitmapDisplayer()正常显示一张图片
5、实现加载图片的方法:
1)、加载默认配置的图片:
public void displayImage(String uri, ImageView imageView);
参数1:uri代表图片的URL地址,
参数2:imageView代表承载图片的IMAGEVIEW控件
例如:
imageLoader.displayImage(imageUrl, imageView);
2)、加载自定义配置的图片:
public void displayImage(String uri, ImageView imageView, DisplayImageOptions options);
参数1:uri代表图片的URL地址;
参数2:imageView代表承载图片的IMAGEVIEW控件;
参数3:options代表DisplayImageOptions配置文件
例如:
imageLoader.displayImage(imageUrl, imageView,options);
3)、图片加载时带加载情况的监听:
public void displayImage(String uri, ImageView imageView, DisplayImageOptions options, ImageLoadingListener listener);
参数4:ImageLoadingListener 用于监听图片的下载情况;
例如:
imageLoader.displayImage(imageUrl, imageView, options, new ImageLoadingListener() {
@Override
public void onLoadingStarted() {
//开始加载的时候执行
}
@Override
public void onLoadingFailed(FailReason failReason) {
//加载失败的时候执行
}
@Override
public void onLoadingComplete(Bitmap loadedImage) {
//加载成功的时候执行
}
@Override
public void onLoadingCancelled() {
//加载取消的时候执行
}});
4、图片加载时带监听又带加载进度条的情况:
public void loadImage(String uri, ImageSize targetImageSize, DisplayImageOptions options,
ImageLoadingListener listener, ImageLoadingProgressListener progressListener);
例如:
imageLoader.displayImage(imageUrl, imageView, options, new ImageLoadingListener() {
@Override
public void onLoadingStarted() {
//开始加载的时候执行
}
@Override
public void onLoadingFailed(FailReason failReason) {
//加载失败的时候执行
}
@Override
public void onLoadingComplete(Bitmap loadedImage) {
//加载成功的时候执行
}
@Override
public void onLoadingCancelled() {
//加载取消的时候执行
},
new ImageLoadingProgressListener() {
@Override
public void onProgressUpdate(String imageUri, View view, int current,int total) {
//在这里更新 ProgressBar的进度信息
}
});
【备注:】
使用ImageLoader加载图片,这里以在ListView中为每个item异步加载图片为例,只要在Adapter的getView方法中调用如下方法即完成了异步列表图片加载,其中options是之前定义的图片加载和显示选项,animateFirstListener是当图片第一次加载的监听事件,目的在于显示一个淡入的显示效果动画,可以添加其他事件
另外,本例还实现了当列表滑动过程中暂停加载和在用户手放开时才开始加载的功能,这样的好处是保证在列表图片异步加载的过程中不出现卡顿的现象,保证加载的顺滑性。实现这一功能的手段是使ListView监听一个由ImageLoader包含的监听事件PauseOnScrollListener。
若设置cacheOnDisc(true)的话,则缓存的文件可以在/sdcard/Android/data/[package_name]/cache目录下看到。不过建议定期清理缓存,否则时间一长,SD卡就会被占满了,同时也可以在ImageLoaderConfiguration中配置SD的缓存策略,有限制缓存文件数量的,有限制缓存文件最大尺寸等选项。
如果在使用过程中遭遇OOM异常,则建议在ImageLoaderConfiguration中设置threadPoolSize在1-5之间合适。在DisplayOption配置时使用。
三、Demo案例:
(一)、注意事项 :
1、上述提到的2个权限必须加入,否则会出错
2、ImageLoaderConfiguration必须配置并且全局化的初始化这个配置ImageLoader.getInstance().init(config); 否则也会出现错误提示
3、ImageLoader是根据ImageView的height,width确定图片的宽高。
4、如果经常出现OOM
①、减少配置之中线程池的大小,(.threadPoolSize).推荐1-5;
②、使用.bitmapConfig(Bitmap.config.RGB_565)代替ARGB_8888;
③、使用.imageScaleType(ImageScaleType.IN_SAMPLE_INT)或者 .imageScaleType(ImageScaleType.EXACTLY);
④、避免使用RoundedBitmapDisplayer.他会创建新的ARGB_8888格式的Bitmap对象;
⑤、使用.memoryCache(new WeakMemoryCache()),不要使用.cacheInMemory();
(二)、简单描述一下这个项目的结构:
每一个图片的加载和显示任务都运行在独立的线程中,除非这个图片缓存在内存中,这种情况下图片会立即显示。如果需要的图片缓存在本地,他们会开启一个独立的线程队列。如果在缓存中没有正确的图片,任务线程会从线程池中获取,因此,快速显示缓存图片时不会有明显的障碍。