DiskLruCache是谷歌推荐的用来实现硬盘缓存的类,本案例将对DiskLruCache的基本用法做一个总结,包括:创建缓存、查找使用缓存、移除缓存等等。

实现效果图

创建DiskLruCache

DiskLruCache使用open方法创建一个实例,例如以下所看到的:相应的四个參数分别为:缓存文件夹、应用版本、单个key相应的数据的个数(一般设为1)、缓存的总大小,当中key是图片的url经过MD5转码获得的,防止url带有特殊符号影响缓存的正常使用。

  1. try {
  2. File cacheDir = getDiskCacheDir(this, "bitmap");
  3. if (!cacheDir.exists()) {
  4. cacheDir.mkdirs();
  5. }
  6. mDiskLruCache = DiskLruCache.open(cacheDir, getAppVersion(this), 1, 10 * 1024 * 1024);
  7. } catch (Exception e) {
  8. e.printStackTrace();
  9. }

存储缓存

通过DiskLruCache.Editor能够获取到缓存对象的编辑对象editor,相似于SharedPreference的editor。DiskLruCache不同意同一时候编辑一个缓存对象。假设这个缓存对象正在被编辑,则editor==null。

  1. new Thread(new Runnable() {
  2. @Override
  3. public void run() {
  4. try {
  5. String key = hashKeyForDisk(imageUrl);
  6. DiskLruCache.Editor editor = null;
  7. editor = mDiskLruCache.edit(key);
  8. if (editor != null) {
  9. OutputStream outputStream = editor.newOutputStream(0);
  10. if (downloadUrlToStream(imageUrl, outputStream)) {
  11. editor.commit();
  12. } else {
  13. editor.abort();
  14. }
  15. }
  16. //不该频繁的flush,防止journal日志文件的频繁改动
  17. mDiskLruCache.flush();
  18. handler.post(new Runnable() {
  19. @Override
  20. public void run() {
  21. textView.setText("saveCache done,the bitmap is ready");
  22. }
  23. });
  24. } catch (IOException e) {
  25. e.printStackTrace();
  26. }
  27. }
  28. }).start();

读取缓存

DiskLruCache.get(String key)方法能够获取到一个Snapshot实例,通过DiskLruCache.Snapshot实例获取缓存文件的输入流。就可以在imageView上显示该图片。

  1. //读取缓存
  2. try {
  3. DiskLruCache.Snapshot snapshot = mDiskLruCache.get(hashKeyForDisk(imageUrl));
  4. if (snapshot != null) {
  5. InputStream is = snapshot.getInputStream(0);
  6. Bitmap bitmap = BitmapFactory.decodeStream(is);
  7. imageView.setImageBitmap(bitmap);
  8. } else {
  9. imageView.setImageBitmap(null);
  10. }
  11. } catch (IOException e) {
  12. e.printStackTrace();
  13. }

另外。DiskLruCache还提供了清空缓存delete()、获取缓存文件夹下的缓存大小size()等方法操作缓存。

本案例源代码包括了DiskLruCache的基本用法,点击下载

Andriod DiskLruCache的使用案例的更多相关文章

  1. LruCache DiskLruCache 缓存 简介 案例 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  2. Andriod布局之LinearLayout

    LinearLayout是安卓中的常见布局,即线性布局.(提示:在Andriod中要常用alt+/快捷键来补全代码 其中有一个重要的属性android:orientation,它是表示线性布局的方向问 ...

  3. 给WebApp加一个“壳”,实现Andriod系统添加到桌面

    IOS系统的Safari浏览器有一个“添加到桌面”的功能,能在手机桌面上为你的Webapp添加一个快捷方式,其外观和Native App看起来一样. 这个功能对Webapp来说太有用了,它能让用户像“ ...

  4. android基础---->DiskLruCache的使用及原理

    DiskLruCache是谷歌推荐的用来实现硬盘缓存的类,今天我们开始对于DiskLruCache的学习.DiskLruCache的测试代码:DiskLruCache的测试代码下载.关于FidkLru ...

  5. 数据库优化案例——————某市中心医院HIS系统

    记得在自己学习数据库知识的时候特别喜欢看案例,因为优化的手段是容易掌握的,但是整体的优化思想是很难学会的.这也是为什么自己特别喜欢看案例,今天也开始分享自己做的优化案例. 最近一直很忙,博客产出也少的 ...

  6. SQL Server内存遭遇操作系统进程压榨案例

    场景: 最近一台DB服务器偶尔出现CPU报警,我的邮件报警阈(请读yù)值设置的是15%,开始时没当回事,以为是有什么统计类的查询,后来越来越频繁. 探索: 我决定来查一下,究竟是什么在作怪,我排查的 ...

  7. solr_架构案例【京东站内搜索】(附程序源代码)

    注意事项:首先要保证部署solr服务的Tomcat容器和检索solr服务中数据的Tomcat容器,它们的端口号不能发生冲突,否则web程序是不可能运行起来的. 一:solr服务的端口号.我这里的sol ...

  8. Yeoman 官网教学案例:使用 Yeoman 构建 WebApp

    STEP 1:设置开发环境 与yeoman的所有交互都是通过命令行.Mac系统使用terminal.app,Linux系统使用shell,windows系统可以使用cmder/PowerShell/c ...

  9. 了不起的 nodejs-TwitterWeb 案例 bug 解决

    了不起的nodejs算是一本不错的入门书,不过书中个别案例存在bug,按照书中源码无法做出和书中相同效果,原本兴奋的心情掺杂着些许失落. 现在我们看一下第七章HTTP,一个Twitter Web客户端 ...

随机推荐

  1. JS获取单选框checked的value方法

    ; var obj = document.getElementsByTagName("input"); document.getElementById('gender').oncl ...

  2. ASP.NET使用Memcached高缓存实例的初级介绍

    Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态.数据库驱动网站的速度.Memcached ...

  3. Python常见文件操作的函数示例

    # -*-coding:utf8 -*- ''''' Python常见文件操作示例 os.path 模块中的路径名访问函数 分隔 basename() 去掉目录路径, 返回文件名 dirname() ...

  4. Linux服务器硬件设备信息查看

    一.cpu信息 cpu信息存储在/proc文件系统的cpuinfo(/proc/cpuinfo)文件里,可以直接查看这个文件以获得cpu信息,所列字段解释如下: processor : 核心编号,如: ...

  5. js的setInterval和setTimeout的那些浅坑

    setInterval和setTimeout的区别简单提一下 setInterval() :按照指定的周期(以毫秒计)来调用函数或计算表达式.方法会不停地调用函数,直到 clearInterval() ...

  6. hdu2087

    #include <stdio.h> #include <string.h> int main(){ int cnt,i,j,k; +],tmp[+]; int strl,tm ...

  7. ubuntu添加开机启动

    vim /etc/init.d/mytest #!/bin/sh echo "$(pwd) and $USER and $(whoami)" >> /root/temp ...

  8. 【leetcode 字符串】466. Count The Repetitions

    https://leetcode.com/problems/count-the-repetitions/description/ 找循环节 https://www.cnblogs.com/grandy ...

  9. LINUX支持哪些文件系统

    我们在Linux中常用的文件系统主要有ext3.ext2及reiserfs :Windows和Dos常用的文件系统是fat系列(包括fat16及fat32等)和ntfs 文件系统:光盘文件系统是ISO ...

  10. Spring JdbcTemplate操作小结

    Spring 提供了JdbcTemplate 来封装数据库jdbc操作细节: 包括: 数据库连接[打开/关闭] ,异常转义 ,SQL执行 ,查询结果的转换 使用模板方式封装 jdbc数据库操作-固定流 ...