论坛首页 移动开发技术论坛

Android图片SD卡缓存

浏览 5611 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-07-16  

本文主要介绍自己开发的一个图片SD卡缓存程序的使用和功能,仅需两步即可。因为直接缓存在SD中,所以适用于图片较大情况,图片较小可直接内存缓存情况可使用ImageCardCache

主要特性:内部实现使用了AutoGetDataCache,所以包含AutoGetDataCache特性——使用简单、可自动获取新数据、可序列化、可从文件中恢复、多种缓存清除方式、包含map的大多数接口等。

适用:应用中获取图片较多且图片较大的情况,在微博、花瓣、美丽说、path这类应用中可以起到很好的效果。

 

1、引入公共库

引入AndroidCommon@GoogleCode或(AndroidCommon@Git)作为android项目的library,或是自己抽取其中的ImageSDCache@GoogleCode或者ImageSDCache@Git部分使用

 

2、使用

仅需简单两步:定义回调接口和缓存、调用loadImageFile加载图片

示例代码如下

// 定义回调接口,在图片图片获取成功后调用
OnImageSDCallListener callListener = new OnImageSDCallListener() {

	private static final long serialVersionUID = 1L;

	@Override
	public void onImageLoaded(String imageUrl, String imagePath, View view) {
		if (!StringUtils.isEmpty(imagePath) && view != null) {
			Drawable d = Drawable.createFromPath(imagePath);
			if (d != null) {
				((ImageView)view).setImageDrawable(d);
			}
		}
	}
};
// 定义图片缓存
ImageSDCardCache imageCache = new ImageSDCardCache(callListener, 256);
// 异步加载图片
imageCache.loadImageFile(imageUrl, imageView);

从上面的代码中可以看出在自定义OnImageSDCallListener时,用户可以自己设置要完成的操作,之后调用imageCache的loadImageFile方法即可自动获得图片并执行OnImageSDCallListener的onImageLoaded方法。

loadImageFile(String, List, View)还存在另外一种形式,可以获取当前图片进行操作并自动获取缓存新图片,见下面介绍

 

3、更多功能

因为代码中注释清晰,所以以下函数都只做大致功能介绍,关于参数和返回值具体意义及其他信息,见相应接口。

3.1 初始化缓存

可以使用以下九种方式之一初始化缓存

ImageSDCardCache(OnImageSDCallListener)}

ImageSDCardCache(OnImageSDCallListener, int)}

ImageSDCardCache(OnImageSDCallListener, String)}

ImageSDCardCache(OnImageSDCallListener, int, CacheFullRemoveType)}

ImageSDCardCache(OnImageSDCallListener, String, int)}

ImageSDCardCache(OnImageSDCallListener, String, int, CacheFullRemoveType)}

ImageSDCardCache(OnImageSDCallListener, String, int, long)}

ImageSDCardCache(OnImageSDCallListener, String, int, long, CacheFullRemoveType)}

loadCache(String)}从文件中恢复缓存

参数意义:OnImageSDCallListener为自定义的获取到图片后要完成的操作,如示例中的第一步。

cacheFolder为图片在sd卡的保存目录,默认为Sd卡的Trinea/AndroidCommon目录下,可通过setCacheFolder设置。默认文件命名为当前时间毫秒数,可通过setFileNameRule(FileNameRule)设置缓存图片保存的文件名规则

maxSize为缓存最大容量,validTime为缓存中元素有效时间。

CacheFullRemoveType为缓存满时删除数据的类型,默认为RemoveTypeFileSmall即文件小先删除,可使用AutoGetDataCache第三部分接口介绍中的其他类型或自定义。

 

3.2 获取图片

loadImageFile(String, View)获取当前图片sd卡保存并进行操作

loadImageFile(String, List, View)获取当前图片sd卡保存进行操作并获取新图片sd卡进行缓存

以上函数都是异步操作,在图片获取成功后会自动执行OnImageSDCallListener的onImageLoaded方法

参数意义:imageUrl为图片url,urlList为图片url list,按照该list中的url顺序获取新图片进行缓存,为空表示不进行缓存,view为操作图片的view

PS:在使用loadImageFile将某个图片设置到ListView中ImageView时可能由于ListView本身缓存的问题,造成几个Item的ImageView相互干扰,这时候可通过设置ImageView的tag唯一性解决。定义OnImageSDCallListener如下

// 定义回调接口,在图片图片获取成功后调用
OnImageSDCallListener callListener = new OnImageSDCallListener() {

	private static final long serialVersionUID = 1L;

	@Override
	public void onImageLoaded(String imageUrl, String imagePath, View view) {
		if ((view.getTag() == null || ObjectUtils.isEquals((String)view.getTag(), imageUrl))
			&& !StringUtils.isEmpty(imagePath) && view != null) {
			Drawable d = Drawable.createFromPath(imagePath);
			if (d != null) {
				((ImageView)view).setImageDrawable(d);
			}
		}
	}
};
// 定义图片缓存
ImageSDCardCache imageCache = new ImageSDCardCache(callListener, 256);
// 异步加载图片
imageCache.loadImageFile(imageUrl, imageView);

listView的adapter中getView如下

public View getView(int position, View convertView, ViewGroup parent) {
	……
	imageView.setTag(imageUrl());
	imageCache.loadDrawable(imageUrl, imageView);
	……
}
 

3.3 其他接口

setFileNameRule(FileNameRule)设置缓存图片保存的文件名规则,其中FileNameRule用户可以使用-以当前时间为文件名的FileNameRuleCurrentTime或是自己实现

 

其他序列化、 缓存命中率、map类似接口等见AutoGetDataCache第三部分接口介绍

 

 

 

   发表时间:2012-07-17  
与Android Query相比有什么区别?
0 请登录后投票
   发表时间:2012-07-19  
ufopw 写道
与Android Query相比有什么区别?

大致看了下 android query
还是有点不一样的,他的出发点是减少客户端代码的编写量。我主要有一些自定义的View和缓存
很感谢提供android query的地址,可以了解下
0 请登录后投票
论坛首页 移动开发技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics