参考:
Android Universal Image Loader 源码分析
Android-Universal-Image-Loader的GitHub地址
使用:
1、依赖:
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
2、权限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
3、Application中配置ImageLoaderConfiguration参数
//配置一:默认
ImageLoader.getInstance().init(ImageLoaderConfiguration.createDefault(this));
//配置二:自定义
File cacheDir = StorageUtils.getCacheDirectory(context); //缓存文件夹路径
//File cacheDir = StorageUtils.getCacheDirectory(getApplicationContext());//默认
//File cacheDir = StorageUtils.getOwnCacheDirectory(this, "imageloader/Cache");
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
.memoryCacheExtraOptions(480, 800)
// default = device screen dimensions 内存缓存文件的最大长宽
.diskCacheExtraOptions(480, 800, null)
// 本地缓存的详细信息(缓存的最大长宽),最好不要设置这个
.taskExecutor(...)
.taskExecutorForCachedImages(...)
.threadPoolSize(3) // default 线程池内加载的数量
.threadPriority(Thread.NORM_PRIORITY - 2)
// default 设置当前线程的优先级
.tasksProcessingOrder(QueueProcessingType.FIFO)
// default FIFO,线程池的线程队列类型。目前只有 FIFO, LIFO 两种可供选择。
.denyCacheImageMultipleSizesInMemory()
.memoryCache(new LruMemoryCache(2 * 1024 * 1024)) //可以通过自己的内存缓存实现
.memoryCacheSize(2 * 1024 * 1024) // 内存缓存的最大值
.memoryCacheSizePercentage(13) // default
.diskCache(new UnlimitedDiscCache(cacheDir))
// default 可以自定义缓存路径
.diskCacheSize(50 * 1024 * 1024) // 50 Mb sd卡(本地)缓存的最大值
.diskCacheFileCount(100) // 可以缓存的文件数量
// default为使用HASHCODE对UIL进行加密命名, 还可以用MD5(new Md5FileNameGenerator())加密
.diskCacheFileNameGenerator(new HashCodeFileNameGenerator())
.imageDownloader(new BaseImageDownloader(context)) // default
.imageDecoder(new BaseImageDecoder()) // default
.defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default
.discCache(new LimitedAgeDiscCache(cacheDir, 7 * 24 * 60 * 60))
// 自定义缓存路径,7天后自动清除缓存
.writeDebugLogs() // 打印debug log
.build(); //开始构建
ImageLoader imageLoader = ImageLoader.getInstance();
if (!imageLoader.isInited()) {//避免多次配置
imageLoader.init(config);
}
4、要显示图片的地方配置DisplayImageOptions参数
DisplayImageOptions options = new DisplayImageOptions.Builder()
//加载图片时的图片
.showImageOnLoading(R.drawable.ic_stub)
//没有图片资源时的默认图片
.showImageForEmptyUri(R.drawable.ic_empty)
//加载失败时的图片
.showImageOnFail(R.drawable.ic_error)
//启用内存缓存,默认false
.cacheInMemory(true)
//启用外存缓存,默认false
.cacheOnDisk(true)
//是否考虑JPEG图像EXIF参数(旋转,翻转)启用EXIF和JPEG图像格式,默认false,// 会识别图片的方向信息
.considerExifParams(true)
//设置显示风格这里是圆角矩形,默认SimpleBitmapDisplayer
//设置图片的显示方式:
// RoundedBitmapDisplayer(int roundPixels)设置圆角图片
// FakeBitmapDisplayer()这个类什么都没做
// FadeInBitmapDisplayer(int durationMillis)设置图片渐显的时间
// SimpleBitmapDisplayer()正常显示一张图片
.displayer(new RoundedBitmapDisplayer(30))
//默认是ARGB_8888, 使用RGB_565会比使用ARGB_8888少消耗2倍的内存
.bitmapConfig(Bitmap.Config.RGB_565)
// default false //设置图片在下载前是否重置,复位,//在ImageView显示图片之前先清空已有的图片内容
.resetViewBeforeLoading(false)
.delayBeforeLoading(1000)//下载前的延迟时间
//设置图片的缩放方式:
// EXACTLY :图像将完全按比例缩小的目标大小
// EXACTLY_STRETCHED:图片会缩放到目标大小完全
// IN_SAMPLE_INT:图像将被二次采样的整数倍
// IN_SAMPLE_POWER_OF_2:图片将降低2倍,直到下一减少步骤,使图像更小的目标大小
// NONE:图片不会调整
.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default
.handler(new Handler()) // default
.build();
//displayImage:异步加载并显示图片
ImageLoader.getInstance().displayImage(url,imagview,options);
注意:url可以是网络、SD卡、assets、drawable,如下:
String url = "http://sd.daicash.cn/data/avatar/f1a7eb0aa2f4dad6136f6c5b50c6f4ee/a_1501_1.jpg";// from Web
String url = "file:///mnt/sdcard/image.png"; // from SD card
String url = "assets://image.png"; // from assets
String url = "drawable://" + R.drawable.image; // from drawables(only images, non-9patch)
String url = "content://media/external/audio/albumart/13"; //from content provider
ImageLoader 加载图片主要分为三类接口:
displayImage(…) 表示异步加载并显示图片到对应的ImageAware上。
loadImage(…) 表示异步加载图片并执行回调接口。
loadImageSync(…) 表示同步加载图片。
参数介绍:
uri: 图片的 uri。uri 支持多种来源的图片,包括 http、https、file、content、assets、drawable 及自定义。
imageAware: 一个接口,表示需要加载图片的对象,可包装 View。
options: 图片显示的配置项。比如加载前、加载中、加载失败应该显示的占位图片,图片是否需要在磁盘缓存,是否需要在内存缓存等。
ImageLoadingListener: 图片加载各种时刻的回调接口,包括开始加载、加载失败、加载成功、取消加载四个时刻的回调函数。
ImageLoadingProgressListener: 图片加载进度的回调接口。
示例:
imageLoader.loadImage(url, new ImageSize(35, 35), options, new ImageLoadingListener() {
@Override
public void onLoadingStarted(String imageUri, View view) {
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
}
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
}
@Override
public void onLoadingCancelled(String imageUri, View view) {
}
}, new ImageLoadingProgressListener() {
@Override
public void onProgressUpdate(String imageUri, View view, int current, int total) {
}
});
5、在需要清除缓存的地方可以清除缓存
ImageLoader.getInstance().clearMemoryCache(); // 清除内存缓存
ImageLoader.getInstance().clearDiskCache(); // 清除本地文件缓存
6、设置滚动是否加载
//Universal-Image-Loader提供了PauseOnScrollListener这个类来控制ListView,GridView滑动过程中停止去加载图片。
// 第一个参数就是我们的图片加载对象ImageLoader,
// 第二个参数控制是否在滑动过程中暂停加载图片,如果需要暂停传true就行了,
// 第三个参数控制猛的滑动界面的时候图片是否加载图片,如果需要暂停传true就行了,
listView.setOnScrollListener(new PauseOnScrollListener(ImageLoader.getInstance(), true, true));
关于缓存:
内存缓存默认是:LruMemoryCache,
磁盘缓存默认是:UnlimitedDiscCache。
磁盘缓存文件名默认生成方式:HashCodeFileNameGenerator
1、 内存缓存:相关类继承关系及介绍
MemoryCache:内存缓存的接口,里面定义了内存缓存的先关操作,
比如:读取一个缓存,放入一个缓存,移除一个缓存,清空缓存
LruMemoryCache:框架默认,lru算法,强引用
LimitedAgeMemoryCache:超出时间则删除,强引用
FuzzyKeyMemoryCache:同一个图片新的尺寸会覆盖缓存中该图片老的尺寸。
BaseMemoryCache:以强或弱引用的方式保存bitmap,便于虚拟机在内存不足时回收缓存对象。
WeakMemoryCache:弱引用
LimitedMemoryCache:强或弱引用,限制存储容量的内存缓存策略,
最大容量为16M,未超出容量强引用,超出容量软引用
FIFOLimitedMemoryCache:先进先出的缓存策略,当超过缓存限定值,
先删除最先加入缓存的bitmap
LRULimitedMemoryCache:lru算法,弱引用,当超过缓存限定值,
先删除最近最少使用的bitmap
LargestLimitedMemoryCache:当超过缓存限定值,
先删除最大的bitmap
UsingFreqLimitedMemoryCache:当超过缓存限定值,
先删除使用次数最少的bitmap
2、硬盘缓存:相关类继承关系及介绍
DiskCache
LruDiskCache:lru算法,默认缓存大小32kb,超出容量则删除最近最少使用。
BaseDiskCache:默认缓存大小32kb
LimitedAgeDiskCache:设定文件存活的最长时间,当超过这个值,就删除该文件
UnlimitedDiskCache:这个缓存类没有时间限制,框架默认
3、 磁盘缓存文件名的生成:相关类继承关系及介绍
FileNameGenerator:在缓存文件时对文件名称的修改
HashCodeFileNameGenerator:该类负责获取文件名称的hashcode然后转换成字符串。默认
Md5FileNameGenerator:该类把源文件的名称通过md5加密后保存。
关于图片显示
相关类继承关系及介绍:
BitmapDisplayer:在ImageAware中显示bitmap对象的接口。可在实现中对bitmap做一些额外处理,比如加圆角、动画效果。
CircleBitmapDisplayer:
显示原型图片在ImageAware中,实现了BitmapDisplayer接口。主要通过BitmapShader实现。
FadeInBitmapDisplayer:
图片淡入方式显示在ImageAware中,实现了BitmapDisplayer接口。
RoundedBitmapDisplayer:
为图片添加圆角显示在ImageAware中,实现了BitmapDisplayer接口。主要通过BitmapShader实现。
RoundedVignetteBitmapDisplayer:
为图片添加渐变效果的圆角显示在ImageAware中,实现了BitmapDisplayer接口,主要通过RadialGradient实现。
SimpleBitmapDisplayer:
直接将图片显示在ImageAware中,实现了BitmapDisplayer接口。