Android DiskLruCache学习笔记


转载请注明出处:http://blog.csdn.net/ibelieveyouwxy/article/details/50403659


  最近无聊刷糗百,发现糗百在没有网络的情况下,还是可以看到上次退出时候的数据,于是想探究一下糗百的数据缓存是怎么做的,网上找了很多资料之后,发现了一个很棒的硬盘缓存方案。DiskLruCache ,一个Google推荐的缓存方案,虽然不是Google官方编写。

废话不多说,先上下载地址,在OKhttp里面封装了这个文件,如果用okhttp做数据请求的话,可以直接查看diskLruCache。DiskLruCache下载地址


-如果我们要创建一个DiskLruCache的实例,则需要调用它的open()方法

public static DiskLruCache open(File directory, int appVersion, int valueCount, long maxSize)
 * 第一个参数指定的是数据的缓存地址
 * 第二个参数指定当前应用程序的版本号
 * 第三个参数指定同一个key可以对应多少个缓存文件,基本都是传1
 * 第四个参数指定最多可以缓存多少字节的数据

当然啦,我们可以封装一个manager类,来实现各个方法:

public synchronized boolean open(Context context, String uniqueName) {
        try {
            File cacheDir = getDiskCacheDir(context, uniqueName);
            if (!cacheDir.exists()) {
                cacheDir.mkdirs();
            }
            cache = DiskLruCache.open(cacheDir, getAppVersion(context), valueCount, size);
            return true;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return false;
    }

这是一个实现open的方法,在里面还包含了一个getDiskCacheDir方法,来获取缓存的地址和getAPPVersion方法来获取app版本:

private File getDiskCacheDir(Context context, String uniqueName) {
        String cachePath;
        if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())
                || !Environment.isExternalStorageRemovable()) {
            cachePath = context.getExternalCacheDir().getPath();
        } else
            cachePath = context.getCacheDir().getPath();
        return new File(cachePath + File.separator + uniqueName);
    }

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

获取缓存的地址,如果内存卡存在,调用getExternalCacheDir获取缓存位置
获取到位置为:/sdcard/Android/data//cache
内存卡不存在,调用getCacheDir获取位置
获取位置为:/data/data//cache

-存储缓存数据:

 public Editor edit(String key)
 /**
     * 存储一个obj对象
     *
     * @param key
     * @param obj
     * @return
     */
    public synchronized boolean put(String key, Object obj) {
        String json = gson.toJson(obj);
        DiskLruCache.Editor editor = null;
        try {
            editor = cache.edit(key);
            editor.set(0, json);
            editor.commit();
            return true;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return false;
    }


 /**
     * 存储一个String对象
     *
     * @param key
     * @param str
     * @return
     */
public synchronized boolean put(String key, String str) {
        DiskLruCache.Editor editor = null;
        try {
            editor = cache.edit(key);
            editor.set(0, str);
            editor.commit();
            return true;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return false;
    }

-取出存储的数据:

public synchronized Snapshot get(String key)
 /**
     * 取出缓存数据
     * 取出的是Object对象
     *
     * @param key
     * @param type
     * @param <T>
     * @return
     */
    public synchronized <T> T get(String key, Type type) {
        try {
            String data = cache.get(key).getString(0);
            T o = gson.fromJson(data, type);
            return o;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

 /**
     * 取出数据,非obj对象
     *
     * @param key
     * @param <T>
     * @return
     */
    public synchronized <T> T get(String key) {
        try {
            String data = cache.get(key).getString(0);
            T o = (T) data;
            return o;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

-移除某个缓存数据

public synchronized boolean remove(String key)

封装方法如下:
根据返回的boolean值判断移除是否成功!

public synchronized boolean remove(String key) {
        try {
            cache.remove(key);
            return true;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return false;
    }

-获取缓存的总大小

 public synchronized long size() 

前缓存路径下所有缓存数据的总字节数,以byte为单位,如果应用程序中需要在界面上显示当前缓存数据的总大小,就可以通过调用这个方法计算出来

 public synchronized long getSize() {
        if (!cache.isClosed())
            return cache.size();
        return 9999;
    }

-关闭缓存,这个方法跟open方法是对应的

public synchronized void close()

关闭掉了之后就不能再调用DiskLruCache中任何操作缓存数据的方法,
通常只应该在Activity的onDestroy()方法中去调用close()方法。

    public synchronized void close() {
        try {
            cache.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

-清除缓存功能

public void delete()

这个方法用于将所有的缓存数据全部删除,
手动清理缓存功能,这个入口一般在设置里面显示,是否清除缓存。
只需要调用一下DiskLruCache的delete()方法就可以实现了。

    public synchronized void delete() {
        try {
            if (!cache.isClosed())
                cache.delete();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

以上就是关于DiskLruCache的主要功能,写的不好,还望斧正!一起交流,共同进步。
下载DiskLruCacheManager 和DiskLruCache地址

猜你喜欢

转载自blog.csdn.net/ibelieveyouwxy/article/details/50403659