【专业知识】Android中的磁盘缓存

前言:

在上一篇文章中介绍了内存缓存,内存缓存的优点就是很快,但是它又有缺点:

  • 空间小,内存缓存不可能很大;
  • 内存紧张时可能被清除;
  • 在应用退出时就会消失,做不到离线;

基于以上的缺点有时候又需要另外一种缓存,那就是磁盘缓存。大家应该都用过新闻客户端,很多都有离线功能,功能的实现就是磁盘缓存。

DiskLruCache:

在Android中用到的磁盘缓存大多都是基于DiskLruCache实现的,具体怎么使用呢?

  • 创建一个磁盘缓存对象:

public static DiskLruCache open(File directory, int appVersion, int valueCount, long maxSize);

open()方法接收四个参数,第一个参数指定的是数据的缓存地址,第二个参数指定当前应用程序的版本号,第三个参数指定同一个key可以对应多少个缓存文件,基本都是传1,第四个参数指定最多可以缓存多少字节的数据。

  • 获取缓存路径:

// Creates a unique subdirectory of the designated app cache directory. Tries to use external // but if not mounted, falls back on internal storage. public static File getDiskCacheDir(Context context, String uniqueName) { // Check if media is mounted or storage is built-in, if so, try and use external cache dir // otherwise use internal cache dir final String cachePath = Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) || !isExternalStorageRemovable() ? getExternalCacheDir(context).getPath() : context.getCacheDir().getPath(); return new File(cachePath + File.separator + uniqueName); }

  • 获取软件版本号:

public int getAppVersion(Context context) { try { PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0); return packageInfo.versionCode; } catch (NameNotFoundException e) { e.printStackTrace(); } return 1; }

  • 完整的代码如下:

DiskLruCache mDiskLruCache = null; try { File cacheDir = getDiskCacheDir(context, "thumbnails"); if (!cacheDir.exists()) { cacheDir.mkdirs(); } mDiskLruCache = DiskLruCache.open(cacheDir, getAppVersion(context), 1, 10 * 1024 * 1024); } catch (IOException e) { e.printStackTrace(); }

  • 具体怎么使用上面创建的磁盘缓存如下:

//添加缓存 public void addBitmapToCache(String key, Bitmap bitmap) { // Add to memory cache as before,把缓存放到内存缓存中 if (getBitmapFromMemCache(key) == null) { mMemoryCache.put(key, bitmap); } // Also add to disk cache,把缓存放入磁盘缓存 synchronized (mDiskCacheLock) { if (mDiskLruCache != null && mDiskLruCache.get(key) == null) { mDiskLruCache.put(key, bitmap); } } } //获取缓存 public Bitmap getBitmapFromDiskCache(String key) { synchronized (mDiskCacheLock) { // Wait while disk cache is started from background thread while (mDiskCacheStarting) { try { mDiskCacheLock.wait(); } catch (InterruptedException e) {} } if (mDiskLruCache != null) { return mDiskLruCache.get(key); } } return null; }

总结:

以上是磁盘缓存的创建和使用方法。在实际操作中内存缓存和磁盘缓存是配合起来使用的,一般先从内存缓存中读取数据,如果没有再从磁盘缓存中读取。

原文发布于微信公众号 - 程序员互动联盟(coder_online)

原文发表时间:2015-06-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android 研究

OKHttp源码解析(七)--中阶之缓存机制

Entry内部类是实际用于存储的缓存数据的实体类,每一个url对应一个Entry实体

715
来自专栏精讲JAVA

Bio、Nio、Aio的用法系列之BIO(一)

上面我们开始监听8888端口,启动这个main后,肯定阻塞到accept,等待客户端发送过来消息

983
来自专栏IT笔记

JAVA实现一个简单的RPC+项目源码

论坛中说到聊一聊RPC远程过程调用协议 http://www.52itstyle.com/thread-22564-1-1.html RPC(Remote Pr...

4339
来自专栏技术记录

java获取properties配置文件值

package me.ilt.Blog.util; import java.io.File; import java.io.FileInputStream; ...

1755
来自专栏坚毅的PHP

zookeeper学习系列:二、api实践

上一章我们知道zookeeper的简介,启动,设置节点以及结构性能。本小节我们来玩玩api,获取下数据。 php版本: http://anykoro.sinaa...

3154
来自专栏Phoenix的Android之旅

Java transient关键字

transient关键字是开发中用的比较少的一个关键字,它在序列化和反序列化中比较重要,通常面试时会考察它的作用和它的使用场景,还有它在什么情况下会失效。

552
来自专栏用户画像

获得InputStream,读取配置文件的方式

InputStream in = new BufferedInputStream(new FileInputStream("E:\\svn_new\\3icom...

602
来自专栏编程软文

redis是如何存储对象和集合的

1767
来自专栏奔跑的蛙牛技术博客

Java网络知识之socket

当我们一个client连接一个套接字时,当前线程会被阻塞直到建立连接或者超时为止 同样的当通过套接字读写数据时,当前线程也会被阻塞或者直到超时 对于这种阻塞...

814
来自专栏世界第一语言是java

java根据ip地址获取城市地域信息

1895

扫描关注云+社区