您的位置:首页 > 其它

ImageLoader 笔记

2016-01-10 13:45 441 查看

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就行了,第三个参数控制猛的滑动界面的时候图片是否加载

(4)Uri 参数: 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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息