Android 图片的三级缓存机制实例分析

当我们获取图片的时候,如果不加以协调好图片的缓存,就会造成大流量,费流量应用,用户体验不好,影响后期发展。为此,我特地分享Android图片的三级缓存机制之从网络中获取图片,来优化应用,具体分三步进行:
(1)从缓存中获取图片
(2)从本地的缓存目录中获取图片,并且获取到之后,放到缓存中
(3)从网络去下载图片,下载完成之后,保存到本地和放到缓存中
很好的协调这三层图片缓存就可以大幅度提升应用的性能和用户体验。
快速实现三级缓存的工具类ImageCacheUtil如下(有更好的建议可以发我的邮箱说出你的想法,一起完善,邮箱见博客主页“给我写信”):
1.从网络中获取图片的三级缓存工具类ImageCacheUtil
public class ImageCacheUtil {
private LruCache<String, Bitmap> lruCache;
private File cacheDir;
private ExecutorService newFixedThreadPool;
private Handler handler;
public static final int SUCCESS = 100;
public static final int FAIL = 101;
//当我们获取图片的时候,分三步
//1.从缓存中获取图片
//2.从本地的缓存目录中获取图片,并且获取到之后,放到缓存中
//3.从网络去下载图片,下载完成之后,保存到本地缓存目录和放到缓存中
public ImageCacheUtil(Context context,Handler handler){
//获取缓存的大小
int maxsize = (int) (Runtime.getRuntime().maxMemory()/8);
//maxSize : 设置缓存的最大空间
lruCache = new LruCache<String, Bitmap>(maxsize){
//获取移出的图片所占用的空间,当图片移出的时候,需要将图片占用的缓存空间从缓存中移出
@Override
protected int sizeOf(String key, Bitmap value) {
//计算图片所占用的缓存大小
//getRowBytes : 获取图片一行所占用的大小
//getHeight : 获取图片所占用行数
return value.getRowBytes()*value.getHeight();
}
};
//获取缓存目录
cacheDir = context.getCacheDir();
//获取线程池
//nThreads : 线程池中的线程数量
newFixedThreadPool = Executors.newFixedThreadPool(5);
this.handler = handler;
}
/**
* 获取图片的方法
* @param url
* @param positon
* @return
*/
public Bitmap getBitmap(String url,int position){
Bitmap bitmap = null;
//1.从缓存中获取图片 (LRUCache<k,v>) k:key 保存图片的标示,一般都是图片的url地址,v:value 图片
bitmap = lruCache.get(url);//根据key从缓存中获取相应的图片
//lruCache.put(url, bitmap):保存图片到缓存中
if (bitmap!=null) {
return bitmap;
}
//2.从本地的缓存目录中获取图片,并且获取到之后,放到缓存中
bitmap = getFromLocal(url);
if (bitmap!=null) {
return bitmap;
}
//3.从网络去下载图片,下载完成之后,保存到本地缓存目录和放到缓存中
getFromNet(url,position);
return null;
}
/**
* 从网络下载图片,异步方式,线程池
* @param url
* @param position
*/
private void getFromNet(String url, int position) {
newFixedThreadPool.execute(new RunnableTask(url,position));
}
class RunnableTask implements Runnable{
private String imageUrl;
private int position;
public RunnableTask(String url,int position){
this.imageUrl = url;
this.position = position;
}
@Override
public void run() {
Message message = Message.obtain();
//下载图片
try {
URL url = new URL(imageUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(3000);
conn.setConnectTimeout(5000);
conn.setRequestMethod("GET");
InputStream inputStream = conn.getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
//保存到本地缓存中
wirteToLocal(imageUrl, bitmap);
//保存到系统缓冲中
lruCache.put(imageUrl, bitmap);
//显示图片,给handler发送消息
message.what = SUCCESS;
message.obj = bitmap;
message.arg1 = position;
handler.sendMessage(message);
return;
} catch (Exception e) {
e.printStackTrace();
}
message.what = FAIL;
handler.sendMessage(message);
}
}
/**
* 从本地缓存目录获取图片
* @param url
*/
private Bitmap getFromLocal(String url) {
//根据图片的名称获取图片
try {
String fileName = MD5Encoder.encode(url).substring(10);
File file = new File(cacheDir, fileName);
Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
//防盗缓存当中
lruCache.put(url, bitmap);
return bitmap;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 将图片保存到本地缓存目录中
*/
public void wirteToLocal(String url,Bitmap bitmap){
//url名称,通过MD5加密,并且截取前10位作为名称
try {
String fileName = MD5Encoder.encode(url).substring(10);
File file = new File(cacheDir, fileName);
FileOutputStream out = new FileOutputStream(file);
//format :图片的格式(android中用的png多,因为png质量是不会改变的)
//quality : 压缩比例
//stream : 流信息
bitmap.compress(CompressFormat.JPEG, 100, out);//将图片保存到那个位置
} catch (Exception e) {
e.printStackTrace();
}
}
}
其中用到的MD5Encoder类如下:
public class MD5Encoder {
public static String encode(String string) throws Exception {
byte[] hash = MessageDigest.getInstance("MD5").digest(string.getBytes("UTF-8"));
StringBuilder hex = new StringBuilder(hash.length * 2);
for (byte b : hash) {
if ((b & 0xFF) < 0x10) {
hex.append("0");
}
hex.append(Integer.toHexString(b & 0xFF));
}
return hex.toString();
}
}
2.在MainActivity初始化imageCacheUtil
ImageCacheUtil imageCacheUtil = new ImageCacheUtil(getApplicationContext, handler);
3.在MainActivity中通过handler将图片显示出来
图片通过工具类下载成功之后,不仅要将图片保存到本地缓存中和系统缓存中,还要将图片显示出来,通过handler进行处理,这个handler是设置使用ImageCacheUtil工具类,就要把你的handler传递过来,方便我们传消息给相应使用ImageCacheUtil工具类的类进行处理。
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case ImageCacheUtil.SUCCESS:
//给控件设置图片
Bitmap bitmap = (Bitmap) msg.obj;
int position = msg.arg1;
ImageView image= (ImageView) view.findViewWithTag(position);//就是根据条目的位置获取相应的控件
if (image != null && bitmap != null) {
image.setImageBitmap(bitmap);
}
break;
case ImageCacheUtil.FAIL:
Toast.makeText(getApplicationContext, "图片下载失败", 0).show();
break;
}
};
};
4.在MainActivity中的adapter的getview中进行调用
Bitmap bitmap = imageCacheUtil.getBitmap(list.get(position).listimage, position);
if (bitmap != null) {
viewHodler.image.setImageBitmap(bitmap);
}
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# Android
# 图片的三级缓存机制
# 三级缓存详解
# Android图片三级缓存的原理及其实现
# 详解Android中图片的三级缓存及实例
# 详解Android 图片的三级缓存及图片压缩
# Android中图片的三级缓存机制
# Android图片三级缓存策略(网络、本地、内存缓存)
# Android使用缓存机制实现文件下载及异步请求图片加三级缓存
# Android实现图片异步请求加三级缓存
# android中图片的三级缓存cache策略(内存/文件/网络)
# 浅谈Android 中图片的三级缓存策略
# 下载图片
# 目录中
# 移出
# 当我们
# 要将
# 下载完成
# 都是
# 就会
# 给我
# 很好
# 分三步
# 要把
# 希望能
# 谢谢大家
# 这三
# 就可以
# 我的邮箱
# 池中
# 后期
# 行数
相关文章:
,制作一个手机app网站要多少钱?
定制建站是什么?如何实现个性化需求?
如何在橙子建站中快速调整背景颜色?
建站10G流量真的够用吗?如何应对访问高峰?
如何快速搭建高效服务器建站系统?
网站制作公司,橙子建站是合法的吗?
建站之星后台管理如何实现高效配置?
制作网站外包平台,自动化接单网站有哪些?
网站制作价目表怎么做,珍爱网婚介费用多少?
建站之星×万网:智能建站系统+自助建站平台一键生成
网站代码制作软件有哪些,如何生成自己网站的代码?
如何在宝塔面板中修改默认建站目录?
设计网站制作公司有哪些,制作网页教程?
建站之星Pro快速搭建教程:模板选择与功能配置指南
建站之星如何保障用户数据免受黑客入侵?
动图在线制作网站有哪些,滑动动图图集怎么做?
,怎么用自己头像做动态表情包?
建站之星好吗?新手能否轻松上手建站?
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
实现虚拟支付需哪些建站技术支撑?
无锡营销型网站制作公司,无锡网选车牌流程?
用v-html解决Vue.js渲染中html标签不被解析的问题
建站之星安装模板失败:服务器环境不兼容?
电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?
制作网站的模板软件,网站怎么建设?
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?
家具网站制作软件,家具厂怎么跑业务?
如何基于PHP生成高效IDC网络公司建站源码?
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
在线制作视频的网站有哪些,电脑如何制作视频短片?
如何在建站之星网店版论坛获取技术支持?
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?
南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?
如何选择域名并搭建高效网站?
如何在万网开始建站?分步指南解析
小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建
如何在云主机上快速搭建多站点网站?
简易网站制作视频教程,使用记事本编写一个简单的网页html文件?
购物网站制作公司有哪些,哪个购物网站比较好?
中山网站推广排名,中山信息港登录入口?
如何在建站主机中优化服务器配置?
开源网站制作软件,开源网站什么意思?
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
三星网站视频制作教程下载,三星w23网页如何全屏?
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
企业微网站怎么做,公司网站和公众号有什么区别?
*请认真填写需求信息,我们会在24小时内与您取得联系。