一起动手编写Android图片加载框架

2019-12-10 18:16:05王冬梅

     从以上代码中我们可以看到,open方法内部调用了DiskLruCache的构造方法,并传入了我们传入open方法的4个参数,这4个参数的含义分别如下:

directory:代表缓存文件在文件系统的存储路径;
appVersion:代表应用版本号,通常设为1即可;
valueCount:代表LinkedHashMap中每个节点上的缓存对象数目,通常设为1即可;
maxSize:代表了缓存的总大小,若缓存对象的总大小超过了maxSize,DiskLruCache会自动删去最近最少使用的一些缓存对象。
    以下代码展示了初始化DiskLruCache的惯用代码:

File diskCacheDir= getAppCacheDir(mContext, "images");
if (!diskCacheDir.exists()) {
  diskCacheDir.mkdirs();
}
mDiskLruCache = DiskLruCache.open(diskCacheDir, 1, 1, DISK_CACHE_SIZE); 

    以上代码中的getAppCacheDir是我们自定义的用来获取磁盘缓存目录的方法,它的定义如下:

public static File getAppCacheDir(Context context, String dirName) {
  String cacheDirString;
  if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
    cacheDirString = context.getExternalCacheDir().getPath();
  } else {
    cacheDirString = context.getCacheDir().getPath();
  }
  return new File(cacheDirString + File.separator + dirName);
}

接下来我们介绍如何添加、获取和删除缓存对象。 

(2)添加缓存对象
    先通过以上介绍的getKeyFromUrl获取Bitmap对象对应的key,接下来我们就可以把这个Bitmap存入磁盘缓存中了。我们通过Editor来向DiskLruCache添加缓存对象。首先我们要通过edit方法获取一个Editor对象:

String key = getKeyFromUrl(url);
DiskLruCache.Editor editor = mDiskLruCache.edit(key); 

获取到Editor对象后,通过调用Editor对象的newOutputStream我们就可以获取key对应的Bitmap的输出流,需要注意的是,若我们想通过edit方法获取的那个缓存对象正在被“编辑”,那么edit方法会返回null。相关的代码如下: