ImageLoader 笔记

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值