锁定老帖子 主题:Android图片SD卡缓存
精华帖 (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第三部分接口介绍
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-07-17
与Android Query相比有什么区别?
|
|
返回顶楼 | |
发表时间:2012-07-19
ufopw 写道 与Android Query相比有什么区别?
大致看了下 android query 还是有点不一样的,他的出发点是减少客户端代码的编写量。我主要有一些自定义的View和缓存 很感谢提供android query的地址,可以了解下 |
|
返回顶楼 | |
浏览 5611 次