Android的DiskLruCache硬盘缓存技术
来源:互联网 发布:java工程师项目经验 编辑:程序博客网 时间:2024/05/16 23:44
之前记着LruCache我们从网络下载好的图片现存入到内存,下次直接从内存读取整体读取速度都变快了,但是我们退出应用下次再进来相同的图片是否可以不用从网络读取,所以DiskLruCache就是做这方面的工作。
由于DiskLruCache不是Android官方提供的类,所以我们需要导入该类,可以从Github上搜出来导入即可。
DiskLruCache.open(file, BitmapUtil.getVersion(this), 1, 10 * 1024 * 1024);
通过上面的代码我们就可以初始化一个DiskLruCache对象,其中需要传入四个参数分别是 SD缓存的目录、app版本号、对应文件要缓存的数量、缓存空间大小。
1.设置缓存目录
public static File getDiskCacheDir(Context context, String uniqueName) { String cachePath; if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { cachePath = context.getExternalCacheDir().getPath(); } else { cachePath = context.getCacheDir().getPath(); } return new File(cachePath + File.separator + uniqueName); }
如果SD可用则目录就会存放到/sdcard/Android/data/..包名../cache这个路径下,否则就存放到/data/data/..包名../cache这个目录下。
2.读取版本号
public static int getVersion(Context context) { try { PackageInfo info = context.getPackageManager().getPackageInfo(context.getPackageName(), 0); return info.versionCode; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } return 0; }
做好这两步工作之后我们就可以初始化一个DisLruCache对象了。
private void initDisLrucache() { File file = BitmapUtil.getDiskCacheDir(this, "bitmap"); try { mDiskLruCache = DiskLruCache.open(file, BitmapUtil.getVersion(this), 1, 10 * 1024 * 1024); } catch (IOException e) { e.printStackTrace(); } }
经过初始化之后我们就可以开始使用DisLruCache将下载好的图片存入到SD目录下。
3.下载图片并缓存起来
因为我们不能直接把图片地址作为key直接存放到SD卡 所以需要对url简单的MD5加密当做key值。
public static String hashKeyForDisk(String key) { String cacheKey; try { final MessageDigest mDigest = MessageDigest.getInstance("MD5"); mDigest.update(key.getBytes()); cacheKey = bytesToHexString(mDigest.digest()); } catch (NoSuchAlgorithmException e) { cacheKey = String.valueOf(key.hashCode()); } return cacheKey; } private static String bytesToHexString(byte[] bytes) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < bytes.length; i++) { String hex = Integer.toHexString(0xFF & bytes[i]); if (hex.length() == 1) { sb.append('0'); } sb.append(hex); } return sb.toString(); }
而DisLruCache是使用Editor这个类通过edit完成的。
String url = "http://img.my.csdn.net/uploads/201309/01/1378037235_7476.jpg"; String key = BitmapUtil.hashKeyForDisk(url); try { DiskLruCache.Editor editor = mDiskLruCache.edit(key); if (editor != null) { if (loadImage(url, editor.newOutputStream(0))) { editor.commit(); } else { editor.abort(); } } mDiskLruCache.flush();// 更新缓存日志 } catch (IOException e) { e.printStackTrace(); }
其中的mDiskLruCache.flush()这个方法不是每次都要调用,因为这个方法是用来同步日志用的,所以可以在Activity的onPause方法中调用一次就好。
4.读取缓存图片
读取缓存可直接调取DiskLrucache的get方法即可,可是get放回的是Snapshot对象我们需要再次转换成InputStream,就可以调用BitmapFactory.decodeStram方法获取Bitmap对象从而显示在ImageView上。
String url = "http://img.my.csdn.net/uploads/201309/01/1378037235_7476.jpg"; String key = BitmapUtil.hashKeyForDisk(url); try { DiskLruCache.Snapshot snapshot = mDiskLruCache.get(key); if (snapshot != null) { InputStream is = snapshot.getInputStream(0); Bitmap bitmap = BitmapFactory.decodeStream(is); mImageView.setImageBitmap(bitmap); } } catch (IOException e) { e.printStackTrace(); }
这样我们就完成了写入和读取功能,DisLruCache每次操作都会往journal日志写入日志。除了写入和读取外 还有移除功能。
5.额外功能
移除功能:
try { String imageUrl = "http://img.my.csdn.net/uploads/201309/01/1378037235_7476.jpg"; String key = hashKeyForDisk(imageUrl); mDiskLruCache.remove(key); } catch (IOException e) { e.printStackTrace(); }
计算缓存大小和删除缓存空间
size():这个方法会返回当前缓存路径下所有缓存数据的总字节数,以byte为单位
delete():这个方法用于将所有的缓存数据全部删除
这两个方法就可以处理app中常见的清除缓存的功能。
参考:Android DiskLruCache完全解析,硬盘缓存的最佳方案
- Android的DiskLruCache硬盘缓存技术
- Android DiskLruCache硬盘缓存
- DiskLruCache硬盘缓存技术详解
- Android的缓存技术:LruCache和DiskLruCache
- Android 缓存(2)---硬盘缓存DiskLruCache
- 安卓硬盘缓存技术DiskLruCache详解
- Android DiskLruCache完全解析,硬盘缓存的最佳方案
- Android DiskLruCache完全解析,硬盘缓存的最佳方案
- Android DiskLruCache完全解析,硬盘缓存的最佳方案
- Android DiskLruCache完全解析,硬盘缓存的最佳方案
- Android DiskLruCache完全解析,硬盘缓存的最佳方案
- Android DiskLruCache完全解析,硬盘缓存的最佳方案
- Android DiskLruCache完全解析,硬盘缓存的最佳方案
- Android DiskLruCache完全解析,硬盘缓存的最佳方案
- Android DiskLruCache完全解析,硬盘缓存的最佳方案
- Android DiskLruCache完全解析,硬盘缓存的最佳方案
- Android DiskLruCache完全解析,硬盘缓存的最佳方案
- Android DiskLruCache完全解析,硬盘缓存的最佳方案
- 图像处理之让手心长出眼睛,其实嘴也可以~
- PLSQL 连接 oracle 12c
- 从头认识java-18.4 java多线程原子性操作里面的坑
- CodeForces 614A Link/Cut Tree
- MSDN值得学习的地方
- Android的DiskLruCache硬盘缓存技术
- 各数据库验证存储过程
- 新手粗谈android四大组件之Activity
- qt捕获cmd控制台标准输出(输入输出重定向)
- ZJU1005-Jugs
- 91. String to Integer (atoi)
- 如何设置滚动条样式
- Record linkage
- 什么是带内管理 带外管理?