Universal-Image-Loader是一个应用广泛的图片下载开源库,可以节省开发时很多工程量
下面根据源码内文档初步认识下这个三方库
1.特性
*多线程图片下载(同步或异步)Multithreadimage loading (async or sync)
* 广泛的自定义配置(线程池、下载器、解码器、内存与缓存、图片显示设置等)Wide customization of ImageLoader's configuration (threadexecutors, downloader, decoder, memory and disk cache, display image options,etc.)
* 许多自定义选项提供给图片显示(存根图片、缓存开关、解码选项、位图下载显示灯)Many customization options for every display image call (stubimages, caching switch, decoding options, Bitmap processing and displaying,etc.)
*图片缓存在内存或硬盘上(设备文件系统或SD卡) Imagecaching in memory and/or on disk (device's file system or SD card)
*过程监听(包括下载进程)Listeningloading process (including downloading progress)
2.导入此库到工程中去
下载好jar文件放到工程目录下libs目录中
或者
使用maven库
<dependency>
<groupId>com.nostra13.universalimageloader</groupId>
<artifactId>universal-image-loader</artifactId>
<version>1.9.3</version>
</dependency>
3.AndroidManifest.xml中应声明需要的权限
<manifest>
<!—从互联网下载图片Include following permission if you load images from Internet -->
<uses-permissionandroid:name="android.permission.INTERNET" />
<!—需要在SD卡上缓存 Includefollowing permission if you want to cache images on SD card -->
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE" />
...
</manifest>
4.你可以在Application或Activity中进行初始化(在第一次使用ImageLoader之前)
@Override
publicvoid onCreate() {
super.onCreate();
//Create global configuration and initialize ImageLoader with this config
ImageLoaderConfigurationconfig = new ImageLoaderConfiguration.Builder(this)
...
.build();
ImageLoader.getInstance().init(config);
...
}
5.Configuration和DisplayOptions
Configuration所有可选选项如下:
StorageUtils.getCacheDirectory方法将会根据是否拥有读取外部SD权限以及是否存在SD卡来选择缓存目录,优先选择SD卡
File cacheDir =StorageUtils.getCacheDirectory(context);
也可以通过StorageUtils.getOwnCacheDirectory(Context context, String cacheDir)设置自己的缓存目录,优先选择SD卡
ImageLoaderConfiguration config = newImageLoaderConfiguration.Builder(context)
.memoryCacheExtraOptions(480,800) //第一个参数内存缓存图片宽、第二个为高默认设置为设备屏幕尺寸
.diskCacheExtraOptions(480,800, null)//此项设置除非必要不要设置,会导致下载速度变慢,缓存在硬盘上的设置,第1个参数宽,第二个参数高,第三个参数图片处理实例
.taskExecutor(...)//自定义线程池,使用此属性threadPoolSize、threadPriority、tasksProcessingOrder(QueueProcessingType)无效
.taskExecutorForCachedImages(...)//自定义图片显示线程池,threadPoolSize、threadPriority、tasksProcessingOrder(QueueProcessingType)无效
.threadPoolSize(3)// 图片显示线程池大小,默认3
.threadPriority(Thread.NORM_PRIORITY- 2) // 默认为Thread.NORM_PRIORITY - 2 此值在Thread.MIN_PRIORITY与Thread.MAX_PRIORITY之间
.tasksProcessingOrder(QueueProcessingType.FIFO)// 下载与显示线程队列顺序默认QueueProcessingType.FIFO
.denyCacheImageMultipleSizesInMemory()//不保存多种尺寸图片
.memoryCache(newLruMemoryCache(2 * 1024 * 1024))//实现MemoryCache接口或用LruMemoryCache类
.memoryCacheSize(2* 1024 * 1024)//内存缓存大小,单位byte,默认为1/8应用内存
.memoryCacheSizePercentage(13)// 百分比设置缓存大小,默认1/8
.diskCache(newUnlimitedDiscCache(cacheDir)) // 默认大小无限制,路径由StorageUtils.getCacheDirectory(Context)决定,自己设置下面3属性失效
.diskCacheSize(50* 1024 * 1024)//硬盘缓存区大小,默认无限制
.diskCacheFileCount(100)//硬盘缓存区文件数量,默认无限制
.diskCacheFileNameGenerator(newHashCodeFileNameGenerator()) //图片文件名生成器,默认返回图片链接的hashcode
.imageDownloader(newBaseImageDownloader(context)) // 图片下载器,默认DefaultConfigurationFactory.createImageDownloader()
.imageDecoder(newBaseImageDecoder()) //图片解码器,默认DefaultConfigurationFactory.createImageDecoder()
.defaultDisplayImageOptions(DisplayImageOptions.createSimple())//默认图片显示选项
.writeDebugLogs()//保存调试Log信息,完全关闭使用com.nostra13.universalimageloader.utils.L#disableLogging()方法
.build();
Display Options
如果不将此选项传给ImageLoader.displayImage(...)将使用默认显示选项
所有可选项如下
DisplayImageOptions options = newDisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.ic_stub)//下载中显示的图片,可以为图片资源ID,也可以是Drawable对象
.showImageForEmptyUri(R.drawable.ic_empty)// 图片链接不存在或空时显示的图片,可以为图片资源ID,或Drawable对象
.showImageOnFail(R.drawable.ic_error)// 图片下载、解码时出错显示的图片,可以为图片资源ID或Drawable对象
.resetViewBeforeLoading(false) // 下载图片前是否重置图片显示组件
.delayBeforeLoading(1000)//开始下载任务前延时多久,单位毫秒,默认无延迟
.cacheInMemory(false)// 下载图片是否在内存中缓存,默认false
.cacheOnDisk(false)// 下载图片是否在硬盘上缓存,默认false
.preProcessor(...)缓存前图片处理器
.postProcessor(...)显示前图片处理器
.extraForDownloader(...)//辅助参数传给ImageDownloader#getStream(String,Object)第二个Object
.considerExifParams(false)// 是否考虑EXIF信息,默认false
.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2)// 默认为IN_SAMPLE_POWER_OF_2图片缩小2倍,等待下一步处理以适应目标尺寸,可选NONE不缩放,NONE_SAFE缩放至可接受的最大尺寸,通常是2048*2048,IN_SAMPLE_INT,EXACTLY缩放到指定尺寸,EXACTLY_STRETCHED缩放到指定尺寸,如果原图小于指定尺寸则拉伸
.bitmapConfig(Bitmap.Config.ARGB_8888)// 图片质量参数,默认为ARGB_8888,图片较大,可选有ALPHA_8,ARGB_4444,RGB_565
.decodingOptions(...)//解码选项,
.displayer(newSimpleBitmapDisplayer()) // 默认new SimpleBitmapDisplayer()
.handler(newHandler()) // 自定义hanlder处理显示以及过程中的信息
.build();
6.可接受的图片Uri
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/1"; // from content provider
String imageUri ="assets://image.png"; // from assets
String imageUri = "drawable://" +R.drawable.img; // from drawables (non-9patch images)
drawable://这种形式除非真正需要,推荐使用官方方法setImageSource()
7.一些处理形式
简单处理的3种形式:
直接显示在可以显示图片的组件上
例如imageLoader.displayImage(imageUri, imageView);
使用监听器在下载完成时处理
imageLoader.loadImage(imageUri, newSimpleImageLoadingListener() {
@Override
publicvoid onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
//Do whatever you want with Bitmap
}
});
同步返回Bitmap对象
Bitmap bmp =imageLoader.loadImageSync(imageUri);
完整的处理形式如下:
imageLoader.displayImage(imageUri,imageView, options, new ImageLoadingListener() {
@Override
publicvoid onLoadingStarted(String imageUri, View view) {
...
}
@Override
publicvoid onLoadingFailed(String imageUri, View view, FailReason failReason) {
...
}
@Override
publicvoid onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
...
}
@Override
publicvoid onLoadingCancelled(String imageUri, View view) {
...
}
}, new ImageLoadingProgressListener() {
@Override
publicvoid onProgressUpdate(String imageUri, View view, int current, int total) {
...
}
});
ImageSize targetSize = new ImageSize(80,50); // result Bitmap will be fit to this size
imageLoader.loadImage(imageUri, targetSize,options, new SimpleImageLoadingListener() {
@Override
publicvoid onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
//Do whatever you want with Bitmap
}
});
ImageSize targetSize = new ImageSize(80,50); // result Bitmap will be fit to this size
Bitmap bmp =imageLoader.loadImageSync(imageUri, targetSize, options);