http://site.com/image.png from Web
file:///mnt/sdcard/image.png // from SD card
content://media/external/images/media/13 // from content provider
file:///mnt/sdcard/video.mp4 // from SD card (video thumbnail)
content://media/external/video/media/13 // from content provider (video thumbnail)
assets://image.png // from assets
drawable:// + R.drawable.img // from drawables (non-9patch images)
2、支持通过“listener”监视加载的过程,可以暂停加载图片,在经常使用的ListView、GridView中,可以设置滑动时暂停加载,停止滑动时加载图片(便于节约流量,在一些优化中可以使用)
build.gradle中的dependencies
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
2、AndroidManifest.xml
3、在应用中配置ImageLoaderConfiguration参数(只能配置一次,如多次配置,则默认第一次的配置参数)
ImageLoaderConfiguration configuration = ImageLoaderConfiguration.createDefault(this);
b、自己配置参数
File cacheDir = StorageUtils.getCacheDirectory(context,"image/"); //缓存文件夹路径
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
.memoryCacheExtraOptions(480,800)//内存缓存的设置选项 (最大图片宽度,最大图片高度) 默认当前屏幕分辨率
.memoryCache(new LruMemoryCache(2*1024*1024))//可以通过自己的内存缓存实现
.memoryCacheSize(2*1024*1024) // 内存缓存的最大值
.memoryCacheSizePercentage(13)//设置内存缓存最大大小占当前应用可用内存的百分比 默认为一个当前应用可用内存的1/8
.defaultDisplayImageOptions(DisplayImageOptions.createSimple())//设置默认的图片显示选项
.denyCacheImageMultipleSizesInMemory()//设置拒绝缓存在内存中一个图片多个大小默认为允许,根据不同大小的imageview保存不同大小图片
.diskCacheExtraOptions(480,800,null) // 本地缓存的详细信息(缓存的最大长宽)
.diskCache(new UnlimitedDiskCache(cacheDir))// default 可以自定义缓存路径
.diskCacheSize(50*1024*1024)// 50 Mb sd卡(本地)缓存的最大值
.diskCacheFileCount(100) // 可以缓存的文件数量
.diskCacheFileNameGenerator(new HashCodeFileNameGenerator()//设置硬盘缓存文件名生成规范,还可以用MD5(new Md5FileNameGenerator())加密
.threadPoolSize(3)// 线程池内加载的数量
.threadPriority(Thread.NORM_PRIORITY - 2)//设置当前线程的优先级
.tasksProcessingOrder(QueueProcessingType.FIFO)//设置图片加载和显示队列处理的类型 默认为QueueProcessingType.FIFO如果设置了taskExecutor或者taskExecutorForCachedImages 此设置无效
.taskExecutor(DefaultConfigurationFactory.createExecutor(3,Thread.NORM_PRIORITY- 1, QueueProcessingType.FIFO))// 设置自定义加载和显示图片的线程池
.taskExecutorForCachedImages(DefaultConfigurationFactory.createExecutor(3,Thread.NORM_PRIORITY- 1, QueueProcessingType.FIFO))//设置自定义加载和显示内存缓存或者硬盘缓存图片的线程池
.imageDownloader(new BaseImageDownloader(context))//图片下载器
.imageDecoder(new BaseImageDecoder())//图片解码器
.writeDebugLogs()// 打印debug log
.build();//开始构建
配置好ImageLoaderConfiguration,一定不要忘记进行初始化操作(一般在application中进行初始化)
ImageLoader.getInstance().init(config);
上面的配置根据自己的需要进行配置,不是所有的都要进行配置的。
ImageLoader imageLoader = ImageLoader.getInstance();
b、相关显示参数配置
DisplayImageOptions options = newDisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.ic_stub)// 设置图片下载期间显示的图片
.showImageForEmptyUri(R.drawable.ic_empty)// 设置图片Uri为空或是错误的时候显示的图片
.showImageOnFail(R.drawable.ic_error)// 设置图片加载或解码过程中发生错误显示的图片
.cacheInMemory(true)// 设置下载的图片是否缓存在内存中
.cacheOnDisk(true)// 设置下载的图片是否缓存在SD卡中
.considerExifParams(false)// 是否考虑JPEG图像EXIF参数(旋转,翻转)
.resetViewBeforeLoading(false) //设置图片在加载前是否重置、复位
.delayBeforeLoading(1000) // 下载前的延迟时间
.decodingOptions(...) // 图片的解码设置
.bitmapConfig(Bitmap.Config.ARGB_8888)// default 设置图片的解码类型
.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2)//设置图片以如何的编码方式显示
.displayer(new SimpleBitmapDisplayer())//还可以设置圆角图片new RoundedBitmapDisplayer(20)
.displayer(new FadeInBitmapDisplayer(100))//是否图片加载好后渐入的动画时间
.handler(new Handler())
.build();
c、显示图片
1.ImageLoader.getInstance().displayImage(uri, imageView);//定义要显示的图片的URL和要显示图片的ImageView,图片的显示会使用默认的配置
2.ImageLoader.getInstance().displayImage(uri, imageView, options);//加载自定义配置的一个图片
3.ImageLoader.getInstance().displayImage(uri, imageView, listener);//加载带监听的一个图片
4.ImageLoader.getInstance().displayImage(uri, imageView, options, listener);//加载自定义配置且带监听的一个图片
5.ImageLoader.getInstance().displayImage(uri, imageView, options, listener, progressListener);//加载自定义配置且带监听和进度条的一个图片
参数解析:
imageUrl 图片的URL地址
imageView 显示图片的ImageView控件
options DisplayImageOptions配置信息
listener 图片下载情况的监听
progressListener 图片下载进度的监听
ImageLoader.getInstance().displayImage(uri, imageView, options,new ImageLoadingListener() {
@Override
public void onLoadingStarted(String arg0,View arg1) {
//开始加载
}
@Override
public void onLoadingFailed(String arg0,View arg1,FailReason arg2) {
//加载失败
}
@Override
public void onLoadingComplete(String arg0,View arg1,Bitmap arg2) {
//加载成功
}
@Override
public void onLoadingCancelled(String arg0,View arg1) {
//加载取消
}
},new ImageLoadingProgressListener() {
@Override
public void onProgressUpdate(String imageUri,View view,int current,int total) {
//加载进度
}
});
1、只有在你需要让Image的尺寸比当前设备的尺寸大的时候,你才需要配置maxImageWidthForMemoryCach(...)和maxImageHeightForMemoryCache(...)这两个参数,比如放大图片的时候。其他情况下,不需要做这些配置,因为默认的配置会根据屏幕尺寸以最节约内存的方式处理Bitmap。
2、一个大的线程池会允许多条线程同时工作,但是也会显著的影响到UI线程的速度。但是可以通过设置一个较低的优先级来解决:当ImageLoader在使用的时候,可以降低它的优先级,这样UI线程会更加流畅。在使用List的时候,UI 线程经常会不太流畅,所以在你的程序中最好设置threadPoolSize(...)和threadPriority(...)这两个参数。1)禁用在内存中缓存cacheInMemory(false),如果oom仍然发生那么似乎你的应用程序有内存泄漏,使用MemoryAnalyzer来检测它。
2)减少配置的线程池的大小(.threadPoolSize(...)),建议1~5
3)在显示选项中使用 .bitmapConfig(Bitmap.Config.RGB_565) . RGB_565模式消耗的内存比ARGB_8888模式少两倍.
4)配置中使用.diskCacheExtraOptions(480, 320, null)
5)配置中使用 .memoryCache(new WeakMemoryCache()) .
6)在显示选项中使用.imageScaleType(ImageScaleType.EXACTLY) 或 .imageScaleType(ImageScaleType.IN_SAMPLE_INT)
6、使用RoundedBitmapDisplayer设置圆角无效解决方案:
.displayer(new BitmapDisplayer() {
@Override
public void display(Bitmap bitmap, ImageAware imageAware, LoadedFrom loadedFrom) {
Bitmap bm = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bm);
BitmapShader shader=new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
Paint paint = new Paint();
paint.setShader(shader);
canvas.drawCircle(bitmap.getWidth()/2, bitmap.getHeight()/2, bitmap.getHeight() / 2, paint);
imageAware.setImageBitmap(bm);
}
})
7、一定要对ImageLoaderConfiguration进行初始化,否则会报错.
8、开启缓存后默认会缓存到外置SD卡如下地址(/sdcard/Android/data/[package_name]/cache).如果外置SD卡不存在,会缓存到手机. 缓存到Sd卡需要在AndroidManifest.xml文件中进行如下配置
9、缓存模式可以使用以下已实现的方法 (ImageLoaderConfiguration.memoryCache(...))1)缓存只使用强引用
LruMemoryCache (缓存大小超过指定值时,删除最近最少使用的bitmap) --默认情况下使用
2)缓存使用弱引用
WeakMemoryCache(没有限制缓存)
3)、本地缓存模式可以使用以下已实现的方法 (ImageLoaderConfiguration.diskCache(...))
UnlimitedDiskCache 不限制缓存大小(默认)
TotalSizeLimitedDiskCache (设置总缓存大小,超过时删除最久之前的缓存)
FileCountLimitedDiskCache (设置总缓存文件数量,当到达警戒值时,删除最久之前的缓 存。如果文件的大小都一样的时候,可以使用该模式)
LimitedAgeDiskCache (不限制缓存大小,但是设置缓存时间,到期后删除)
10、清除缓存
public void onClearMemoryClick(View view) {
ImageLoader.getInstance().clearMemoryCache(); // 清除内存缓存
}
public void onClearDiskClick(View view) {
ImageLoader.getInstance().clearDiskCache(); // 清除本地缓存
}