关闭

Android中DisLruCache缓存封装

标签: 缓存androidcache磁盘缓存
650人阅读 评论(0) 收藏 举报
分类:

Android中DisLruCache缓存封装

DisLruCache文件下载

CSDN下载

github下载

DisLruCache介绍

DisLruCache介绍(郭霖博客)

DisLruCache介绍(鸿洋博客)

DisLruCache之CacheManager封装

CacheManager是对DisLruCache的再次封装

public class CacheManager {

    private static CacheManager manager;
    private DiskLruCache mDiskLruCache = null;
    private static final int CACHE_MAX_SIZE = 10 * 1024 * 1024;
    private static final int VALUE_COUNT = 1;
    private static Context context = APP.getContext();
    private static final int BUFFER = 1024;

    private CacheManager() {
    }

    public static CacheManager getInstance() {
        if (manager == null) {
            synchronized (CacheManager.class) {
                if (manager == null) {
                    manager = new CacheManager();
                }
            }
        }
        return manager;
    }

    /**
     * 获取版本号
     */
    public int getAppVersion() {
        try {
            PackageInfo info = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
            return info.versionCode;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return 1;
    }

    /**
     * 获取缓存目录
     */
    public File getDiskCacheDir(@NonNull String uniqueName) {
        String cachePath = "";
        if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())
                || !Environment.isExternalStorageRemovable()) {
            File f = context.getExternalCacheDir();
            if (f != null) {
                cachePath = f.getPath();
            }
        } else {
            cachePath = context.getCacheDir().getPath();
        }
        Log.e("zhang", "getDiskCacheDir: " + cachePath);
        return new File(cachePath + File.separator + uniqueName);
    }

    /**
     * 一个缓存目录只有一个文件
     */
    public CacheManager open(String dir) {
        open(dir, VALUE_COUNT);
        return manager;
    }

    /**
     * dir:缓存的目录/路径
     * valueCount:缓存文件的个数
     */
    public CacheManager open(String dir, int valueCount) {
        try {
            mDiskLruCache = DiskLruCache.open(getDiskCacheDir(dir), getAppVersion(), valueCount, CACHE_MAX_SIZE);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return manager;
    }

    /**
     * md5生成缓存key
     */
    public String hashKeyForDisk(@NonNull 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 String bytesToHexString(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (byte aByte : bytes) {
            String hex = Integer.toHexString(0xFF & aByte);
            if (hex.length() == 1) {
                sb.append('0');
            }
            sb.append(hex);
        }
        return sb.toString();
    }

    /**
     * 保存字符串
     * key是通过LinkedHashMap获取缓存中的Entry对象
     * index是获取目录中的文件索引
     * value是需要保存的信息值
     */
    public void saveString(String key, int index, @NonNull String value) {
        try {
            DiskLruCache.Editor editor = mDiskLruCache.edit(hashKeyForDisk(key));
            editor.set(index, value);
            editor.commit();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void saveString(String key, @NonNull String value) {
        saveString(key, 0, value);
    }

    /**
     * 保存流信息
     * key是通过LinkedHashMap获取缓存中的Entry对象
     * index是获取目录中的文件索引
     * value是需要保存的信息流
     */
    public void saveStream(String key, int index, @NonNull InputStream value) {
        int len = 0;
        byte[] bytes = new byte[BUFFER];
        OutputStream os = null;
        try {
            DiskLruCache.Editor editor = mDiskLruCache.edit(hashKeyForDisk(key));
            os = editor.newOutputStream(index);
            while ((len = value.read(bytes)) != -1) {
                os.write(bytes, 0, len);
            }
            editor.commit();
            mDiskLruCache.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //快速关流
            DiskLruCache.closeQuietly(os);
        }
    }

    public void saveStream(@NonNull String key, @NonNull InputStream value) {
        saveStream(key, 0, value);
    }

    /**
     * 获取缓存的String字符串
     * key是通过LinkedHashMap获取缓存中的Entry对象
     * index是获取目录中的文件索引
     */
    public String getString(@NonNull String key, int index) {
        try {
            DiskLruCache.Snapshot snapshot = mDiskLruCache.get(hashKeyForDisk(key));
            if (snapshot != null) {
                return snapshot.getString(index);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "";
    }

    public String getString(@NonNull String key) {
        return getString(key, 0);
    }

    /**
     * 获取缓存的String字符串
     * key是通过LinkedHashMap获取缓存中的Entry对象
     * index是获取目录中的文件索引
     */
    public InputStream getInputStream(@NonNull String key, int index) {
        try {
            DiskLruCache.Snapshot snapshot = mDiskLruCache.get(hashKeyForDisk(key));
            if (snapshot == null) return null;
            return snapshot.getInputStream(index);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    public InputStream getInputStream(@NonNull String key) {
        return getInputStream(key, 0);
    }

    /**
     * 删除对应的key缓存
     */
    public boolean remove(@NonNull String key) {
        try {
            return mDiskLruCache.remove(hashKeyForDisk(key));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 清除所有信息
     */
    public void clear() {
        try {
            mDiskLruCache.delete();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Android DiskLruCache 源码解析 硬盘缓存的绝佳方案

转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/47251585; 本文出自:【张鸿洋的博客】 一、概述依旧是整理东西...
  • lmj623565791
  • lmj623565791
  • 2015-08-03 09:35
  • 39246

Android照片墙完整版,完美结合LruCache和DiskLruCache

转载地址:http://blog.csdn.net/guolin_blog/article/details/34093441#comments
  • fangzhibin4712
  • fangzhibin4712
  • 2014-08-25 17:25
  • 10902

Android DiskLruCache完全解析,硬盘缓存的最佳方案

记得在很早之前,我有写过一篇文章Android高效加载大图、多图解决方案,有效避免程序OOM,这篇文章是翻译自Android Doc的,其中防止多图OOM的核心解决思路就是使用LruCache技术。但...
  • sinyu890807
  • sinyu890807
  • 2014-08-07 09:13
  • 99126

DisLruCache学习笔记

DiskLruCache学习笔记 简而言之就是在LruCache上进行了扩展 LruCache是自带的,DiskLruCache需要额外下载。 内存缓存是由LruCache的强引用 Linked...
  • xiexiangyu92
  • xiexiangyu92
  • 2017-05-25 13:42
  • 167

android三级缓存

  • 2017-11-30 19:12
  • 15KB
  • 下载

Android 分页缓存图片加载器,gridview显示

  • 2016-08-07 18:46
  • 8.77MB
  • 下载

Android实现WebView图片缓存,替换加载前默认图片的样式

  • 2013-03-11 20:35
  • 1.52MB
  • 下载

Android图片下载三级缓存策略源码的Demo

  • 2015-07-14 16:56
  • 1.71MB
  • 下载

Android 线程池、信号量、Looper、缓存初探

  • 2014-12-29 16:36
  • 2.14MB
  • 下载

Android图片加载框架之Picasso非常好的图片加载缓存库

  • 2017-03-15 18:40
  • 25.10MB
  • 下载
    个人资料
    • 访问:317833次
    • 积分:5526
    • 等级:
    • 排名:第5619名
    • 原创:245篇
    • 转载:7篇
    • 译文:2篇
    • 评论:56条
    博客专栏
    最新评论