自己写的一个图片三级缓存的工具类,下载图片使用的是volley和httpUrlConnection相同
来源:互联网 发布:2015最新dj网络歌曲 编辑:程序博客网 时间:2024/04/27 14:23
根据url加载图片时,会先从内存中找,内存缓存使用LruCache(近期最少使用算法)设置缓存图片的控件不足时,会删除最不常用的Bitmap对象。如果内存中没有,从SD卡加载。SD卡加载为防止OOM已设置虚加载。,SD卡没有从网络上下载图片,并缓存到本地和内存中。根据maxHeight和maxWidth下载需要的尺寸,虚加载的压缩比列也是根据这两个值计算,如果都传入0.代表加载原图。并且针对图片进行了优化,加载的是RGB_565格式,大小比ARGB_8888格式小了一半,但是质量差不多。不影响观看。
/**
* 图片加载器 * Created by Ancx */ public class ImageLoader { private static Handler handler = new Handler(); /** * 线程池 */ private final static ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); /** * 显示图片,设置默认的defaultResource、errorResource和加载原图 * * @param imgUrl 图片的Url路径 * @param imageView 显示图片的容器 */ public static void display(String imgUrl, ImageView imageView) { display(imgUrl, imageView, R.mipmap.ic_launcher,R.mipmap.ic_launcher,0,0); } /** * 显示图片,根据type的值的不同,调用不同的显示方法 * * @param imgUrl 图片的Url路径 * @param imageView 显示图片的容器 * @param value1 type = 1时,代表 defaultResource;type = 2时,代表 maxWidth * @param value2 type = 1时,代表 errorResource;type = 2时,代表 maxHeight * @param type 等于 1 时,value为资源图片;等于 2 时,value为显示图片的最大宽和高 */ public static void display(String imgUrl, ImageView imageView, int value1, int value2, int type) { if (type == 1) { // value1为defaultResource;value2为errorResource display(imgUrl, imageView, value1, value2, 0, 0); } else if (type == 2) { // value1为maxWidth;value2为maxHeight display(imgUrl, imageView, R.mipmap.ic_launcher,R.mipmap.ic_launcher, value1, value2); } } /** * 根据设置的属性显示图片 * * @param imgUrl 图片的Url路径 * @param imageView 显示图片的容器 * @param defaultResource 加载图片时的默认图片 * @param errorResource 加载图片失败时,显示的失败图片 * @param maxWidth 显示图片的最大宽度 * @param maxHeight 显示图片的最大高度 */ public static void display(final String imgUrl, final ImageView imageView, int defaultResource, finalinterrorResource, finalint maxWidth, final int maxHeight) { if (MemoryUtil.getBitmap(imgUrl)!=null) { // 内存中有图片,显示并结束 imageView.setImageBitmap(MemoryUtil.getBitmap(imgUrl)); return; } // 内存中没有图片,在存储卡中查找,由于可能是个耗时操作,需要先加载默认图片 imageView.setTag(imgUrl); imageView.setImageResource(defaultResource); // 开启线程在存储卡中查找图片 executorService.execute(newRunnable() { @Override public void run() { String localPath = MemoryUtil.getLocalPath(imgUrl); // 从存储卡中获取图片 final Bitmap bitmap = BitmapUtil.getStorageCardBitmap(localPath, maxWidth, maxHeight); if (bitmap != null) { // 在存储卡中找到图片 if (imgUrl.equals(imageView.getTag())) { // 如果还需要显示,那么在主线程加载图片,并缓存在内存中 handler.post(newRunnable() { @Override public void run() { // 显示图片 imageView.setImageBitmap(bitmap); } }); } // 缓存图片 MemoryUtil.putBitmap(imgUrl, bitmap); } else { // 没有从存储卡中找到,从网络上下载 if (imgUrl.equals(imageView.getTag())) { downloadBitmap(imgUrl, imageView, errorResource, maxWidth, maxHeight); } } } }); } /** * 从网络上下载图片 * * @param imgUrl 图片的Url路径 * @param imageView 显示图片的容器 * @param errorResource 加载图片失败时显示的错误图片 * @param maxWidth 显示图片的最大宽度 * @param maxHeight 显示图片的最大高度 */ private static void downloadBitmap(finalStringimgUrl, final ImageView imageView,final int errorResource,intmaxWidth, int maxHeight) { ImageRequest imageRequest = new ImageRequest(imgUrl, newResponse.Listener<Bitmap>() { @Override public void onResponse(finalBitmapbitmap) { // 从网络中获取到图片,判断是否要显示,进行显示操作 if (imgUrl.equals(imageView.getTag())) { imageView.setImageBitmap(bitmap); } // 网路上获取的图片缓存到内存中 MemoryUtil.putBitmap(imgUrl, bitmap); // 开启分线程存储图片到存储卡中 executorService.execute(newRunnable() { @Override public void run() { // 存储图片到指定目录 String localPath = MemoryUtil.getLocalPath(imgUrl); if (localPath != null) BitmapUtil.saveBitmapToFile(bitmap, localPath); } }); } }, maxWidth, maxHeight, Bitmap.Config.RGB_565,newResponse.ErrorListener() { @Override public void onErrorResponse(VolleyErrorvolleyError) { // 加载网络图片失败,显示错误图片 imageView.setImageResource(errorResource); } }); App.getQueue().add(imageRequest); }}
0 0
- 自己写的一个图片三级缓存的工具类,下载图片使用的是volley和httpUrlConnection相同
- 关于Volley图片的三级缓存的基本使用
- Volley框架下的三级缓存的使用工具类
- 图片的三级缓存
- 图片的三级缓存
- 图片的三级缓存
- 图片的三级缓存
- 图片的三级缓存
- 图片的三级缓存
- 图片的三级 缓存
- 图片的三级缓存
- 图片的三级缓存
- 图片的三级缓存
- 图片的三级缓存
- 图片的三级缓存
- 图片的三级缓存
- 图片的三级缓存
- 图片的三级缓存
- C 的那点事儿
- leetcode 16. 3Sum Closest
- ubuntu14.04 ibus 输入法框架
- 第13条 类与接口——使类和成员的可访问性最小化
- 【C++】高精度代码运行时间( QueryPerformanceCounter )
- 自己写的一个图片三级缓存的工具类,下载图片使用的是volley和httpUrlConnection相同
- HDU 4135 Co-prime(容斥原理)
- 解决“只能通过Chrome网上应用商店安装该程序”的方法
- 创建dblink语句
- 机器学习实战3:决策树学习笔记(python)
- makefile 教程
- Java之命令模式(Command Pattern)
- Spring基础知识
- SAP LUW 和DB LUW