美文网首页
Android之DiskLruCache

Android之DiskLruCache

作者: 极客匠 | 来源:发表于2020-02-12 21:35 被阅读0次

DiskLruCache不同于LruCache,LruCache是将数据缓存在内存当中,而DiskLruCache是外部存储缓存,是将数据永久缓存到手机外部存储介质中去,并可以将缓存数据取出来使用,DiskLruCache不是google官方所写,但是得到了google的推荐。

DiskLruCache下载地址:

https://github.com/JakeWharton/DiskLruCache

常用方法

方法 备注
DiskLruCache open(File directory, int appVersion, int valueCount, long maxSize) 打开一个缓存目录,如果没有则首先创建它,directory:指定数据缓存地址 appVersion:APP版本号,当版本号改变时,缓存数据会被清除 valueCount:同一个key可以对应多少文件 maxSize:最大可以缓存的数据量
Editor edit(String key) 通过key可以获得一个DiskLruCache.Editor,通过Editor可以得到一个输出流,进而缓存到本地存储上
void flush() 强制缓冲文件保存到文件系统
Snapshot get(String key) 通过key值来获得一个Snapshot,如果Snapshot存在,则移动到LRU队列的头部来,通过Snapshot可以得到一个输入流InputStream
long size() 缓存数据的大小,单位是byte
boolean remove(String key) 根据key值来删除对应的数据,如果该数据正在被编辑,则不能删除
void delete() 关闭缓存并且删除目录下所有的缓存数据,即使有的数据不是由DiskLruCache 缓存到本目录的
void close() 关闭DiskLruCache,缓存数据会保留在外存中
boolean isClosed() 判断DiskLruCache是否关闭,返回true表示已关闭
File getDirectory() 缓存数据的目录

使用方法

  1. 添加权限

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    
  2. DiskLruCache是在外部存储上的,需要判断外部存储是否存在

        private static File getExternalCacheDir(Context context) {
            File dataDir = new File(new File(Environment.getExternalStorageDirectory(), "Android"), "data");
            File appCacheDir = new File(new File(dataDir, context.getPackageName()), "cache");
            if (!appCacheDir.exists()) {
                if (!appCacheDir.mkdirs()) {
                    return null;
                }
            }
            return appCacheDir;
        }
    
  3. 初始化DiskLruCache

        private void init(File cacheDir, Context context) {
            try {
                mDiskLruCache = DiskLruCache.open(cacheDir, getAppVersion(context), 1, 10 * 1024 * 1024);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
  4. 写入缓存

        @Override
        public void put(String key, String value) {
            DiskLruCache.Editor editor = null;
            try {
                editor = mDiskLruCache.edit(hashKeyForDisk(key));
                if (editor != null) {
                    editor.set(0, value);
                    editor.commit();
                }
                mDiskLruCache.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
  1. 读取缓存

        @Override
        public String get(String key) {
            String result = null;
            try {
                DiskLruCache.Snapshot snapShot = mDiskLruCache.get(hashKeyForDisk(key));
                if (snapShot != null) {
                    result = snapShot.getString(0);
                    return result;
                }
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }
            return result;
        }
    

总结

有了工具类数据缓存就变得非常简单,下一讲,我们做一个二级缓存框架ManbaCacheManager

每天多努力那么一点点,积少成多

相关文章

网友评论

      本文标题:Android之DiskLruCache

      本文链接:https://www.haomeiwen.com/subject/cmjoxhtx.html