ImageLoader 笔记
1、ImageLoaderEngine:任务分发器,负责分发LoadAndDisplayImageTask和ProcessAndDisplayImageTask给具体的线程池去执行;
LoadAndDisplayImageTask:用于加载并显示图片的任务;ImageDownloader:图片下载器,负责从图片的各个来源获取输入流;
ImageDecoder:图片解码器,负责将图片输入流InputStream转换为Bitmap对象;
BitmapProcessor:图片处理器,负责从缓存读取或写入前对图片进行处理;
DisplayBitmapTask:用于显示图片的任务;
ProcessAndDisplayImageTask:用于处理并显示图片的任务;
2、Cache:图片缓存,分为MemoryCache和DiskCache两部分;
MemoryCache:内存图片缓存,可向内存缓存缓存图片或从内存缓存读取图片,Map<String, Bitmap>结构,Map的key值为:图片的URL + "_" + width x height ;
DiskCache:本地图片缓存,可向本地磁盘缓存保存图片或从本地磁盘读取图片,文件名默认用:图片的URL的HashCode;
3、默认缓存文件路径
有sd卡时默认指定在SD卡根目录/Android/data/包名/cache/下
无sd卡时,默认先存储在context.getCacheDir下,如果不存在就存储在
data/data/包名/cache/下
参考:ImageLoaderConfiguration.Builder类中的initEmptyFieldsWithDefaultValues方法
如果没有指定缓存路径,采用默认的,那就可以使用StorageUtils.getCacheDirectory(getApplicationContext())来获取sd卡的缓存路径,进而计算大小。
4、指定缓存文件的缓存路径
new ImageLoaderConfiguration.Builder(context).discCache(discCache)
可指定的类有:
BaseDiscCache.class
LimitedAgeDiscCache.class
UnlimitedDiscCache.class
附:计算文件大小,android.text.format.Formatter.formatFileSize(context, long)转换文件大小,单位自带
public static long getDirSize(File file) {
//判断文件是否存在
if (file != null && file.exists()) {
//如果是目录则递归计算其内容的总大小
if (file.isDirectory()) {
File[] children = file.listFiles();
long size = 0;
for (File f : children)
size += getDirSize(f);
return size;
} else {//如果是文件则直接返回其大小
long size = file.length();
return size;
}
} else {
return 0;
}
}
5、线程池:
线程池的默认大小是3,优先级默认是4,范围是1到10
6、图片加载顺序
先从MemoryCache中加载,如果没有就从DiskCache(需要设置开启)中加载,如果加载失败,则从网络上获取图片(因此,服务器端更换图片时是需要更换地址的,同一个地址在cache存在时是不进行第二次网络获取的)
7、使用
(1)初始化
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
.threadPriority(Thread.NORM_PRIORITY - 2)
.denyCacheImageMultipleSizesInMemory()
.discCacheFileNameGenerator(new Md5FileNameGenerator()
.tasksProcessingOrder(QueueProcessingType.LIFO)
.build();
ImageLoader.getInstance().init(config);
(2)加载图片
DisplayImageOptions options = new DisplayImageOptions.Builder()
.showStubImage(R.drawable.ic_stub) //加载开始默认的图片
.showImageOnLoading(R.drawable.gameicon_0)
.showImageForEmptyUri(R.drawable.ic_empty) //url爲空會显示该图片,自己放在drawable里面的
.showImageOnFail(R.drawable.ic_error) //加载图片出现问题,会显示该图片
.cacheInMemory() //缓存用
.cacheOnDisc() //缓存用
.displayer(new RoundedBitmapDisplayer(5)) //图片圆角显示,值为整数
.build();
ImageLoader.getInstance().displayImage(url, imageView,options);
对于本地图片的加载:在其绝对地址前面要加入"file://"
String imageUri = "file:///mnt/sdcard/image.png"; //SD卡图片
(3)ListView滚动时不加载图片
使用GridView,ListView来显示大量的图片,而当我们快速滑动GridView,ListView,我们希望能停止
图片的加载,而在GridView,ListView停止滑动的时候加载当前界面的图片,这个框架当然也提供这个
功能,使用起来也很简单,它提供了PauseOnScrollListener这个类来控制ListView,GridView滑动过程
中停止去加载图片,该类使用的是代理模式
listView.setOnScrollListener(new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling));
gridView.setOnScrollListener(new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling));
第一个参数就是我们的图片加载对象ImageLoader, 第二个是控制是否在滑动过程中暂停加载图片,如果
需要暂停传true就行了,第三个参数控制猛的滑动界面的时候图片是否加载
http:// site.com/image.png
file:/// mnt/sdcard/image.png
file:/// mnt/sdcard/video.mp4
content:// media/external/images/media/13
content://media/external/video/media/13
assets:// image.png
drawable://R.drawable.img
可以这么使用
assets: Scheme.ASSETS.wrap(path)
drawable: Scheme.DRAWABLE.wrap(path)
file: Scheme.FILE.wrap(path)
content: Scheme.CONTENT.wrap(path)
http: Scheme.HTTP.wrap(path)
https: Scheme.HTTPS.wrap(path)