ImageLoader的理解
2015-09-18 11:15:00
ImageLoader作用
- 多线程下载图片,图片可以来源于网络,文件系统,项目文件夹assets中以及drawable中
- 支持图片的内存缓存,文件系统缓存或者SD卡缓存
- 支持图片下载过程的监听
- 根据控件(ImageView)的大小对Bitmap进行裁剪,减少Bitmap占用过多的内存
支持库
'com.nostra13.universalimageloader:universal-image-loader:1.9.4'
权限
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
2015-09-18 14:31:16
ImageLoader加载的类型
- “http://site.com/image.png“ // from Web
- “file:///mnt/sdcard/image.png” // from SD card
- “file:///mnt/sdcard/video.mp4” // from SD card (video thumbnail)
- “content://media/external/images/media/13” // from content provider
- “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)[用imageView.setImageResource(drawable)来代替]
2015-09-18 11:14:55
ImageLoader的加载、显示配置:
加载Image时的配置(ImageLoaderConfiguration)
- (默认配置)通过ImageLoaderConfiguration 的createDefault进行实例化
- (自定义配置)通过new ImageLoaderConfiguration.Builder().builder()方法进行实例化。
通常配置如下:
File diskCache = StorageUtils.getOwnCacheDirectory(context, "BNJ_IMAGE_CACHE/");
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
.diskCache(new UnlimitedDiscCache(diskCache)) // 设置缓存路径
.memoryCacheSize(2 * 1024) // 设置缓存的最大字节
.diskCacheFileNameGenerator(new Md5FileNameGenerator()) // 加密
.denyCacheImageMultipleSizesInMemory() // 禁止缓存显示不同大小的同一张图片
.memoryCacheExtraOptions(800, 760) // 保存每个缓存图片的最大长和宽
.diskCacheFileCount(100) //缓存的File数量
.build();
使用:
通过ImageLoader的getInstance().init()方法传入上述options对象.
2015-09-18 11:49:23
显示Image时的配置(DisplayImageOptions)
- (自定义配置)通过new DisplayImageOptions.Builder().builder()方法实例化对象
通常配置如下:
DisplayImageOptions options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.ic_stub) // 设置加载时的图片 (使用loadImage方法加载时无效)
.showImageForEmptyUri(R.drawable.ic_empty) // resource or drawable
.showImageOnFail(R.drawable.ic_error) // 设置加载失败的图片
.cacheInMemory(true) //设置使用内存缓存
.cacheOnDisk(true) //使用文件缓存
.displayer(new RoundedBitmapDisplayer(20)) // 设置成圆角图片
.bitmapConfig(Bitmap.Config.RGB_565) //减少内存消耗
.delayBeforeLoading(100) //设置下载图片前的延时
.imageScaleType(ImageScaleType.EXACTLY_STRETCHED)
.build();
ImageSize size= new ImageSize(300,300);(大小可以通过创建ImageSize对象设置)
上述图片显示displayer
显示圆角 RoundedBitmapDisplayer (Displays bitmap with rounded corners)
淡入显示 FadeInBitmapDisplayer (Displays image with “fade in” animation)
2015-09-18 18:34:22
加载图片的方法
loadImage跟displayImage
A.ImageLoader.getInstance().loadImage(uri地址,图片大小,上述配置,监听器,进度监听器);
B.ImageLoader.getinstance().displayImage(uri地址,控件,上述配置,监听器,进度监听器);
区别:
A方法可以设置图片大小,即自定义下载图片的大小
B方法会根据控件大小及ImageScaleType来裁剪图片
监听器有两种:
SimpleImageLoadingListener(简单的监听器)
ImageLoadingListener (该监听器能实现 加载图片取消时,失败时的方法)
ImageLoadingProgressListener
5.最后在监听器的onLoadingComplete方法里,设置图片显示即可
进阶
listView.setOnScrollListener(new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling));
第一个参数是imageLoader,第二个参数是滑动时是否加载图片,第三个参数是猛的滑动时是否加载图片
2015/11/23 16:13:06
OOM问题
如果使用了ImageLoader出现OutOfMemoryError的话,那么可以通过下列方法解决
关闭memory的cache。
减少线程池的大小
用Bitmap.Config.RGB565代替ARGB8888
使用.imageScaleType(ImageScaleType.EXACTLY 或ImageScaleType.IN_SAMPLE_INT)
- 使用.diskCacheExtraOption(480, 320, null)
2015-09-18 14:42:49
ImageView ScaleType