写这个主要还是用来记录一下,避免自己长时间不用后想不起来

之前项目里做数据缓存到本地,小的使用SP,大的用Litpal,但是后来想做一个用于存储网络请求下来的数据的工具,就有了现在这个基于DiskLruCache和Reservoir的封装

正文:

介绍:SHDiskCache是基于DiskLruCache和Reservoir的封装,能够实现网络请求下来的数据的本地存储,包括线程管理、缓存时间控制以及回调处理

1.关于DiskLruCache

各位大神对于对它都有介绍,我这边一张图来说明一下它的api

2.使用的前提
需在Application中初始化,初始化方式如下:Reservoir.init(this, 10 * 1024 * 1024),第二个参数表示缓存空间大小

该工具类缓存流程判断:

该工具类:

public class SHDiskCache {private static SHDiskCache cache;private SHDiskCache() {}public static SHDiskCache getInstance() {if (cache == null) {cache = new SHDiskCache();}return cache;}/*** 异步存储缓存  普通方式putAsync putResponse专用于网络请求数据缓存** @param t      要缓存的数据* @param key    存储的key值 建议格式:userid + 对应模块英文* @param minute 缓存保留的时间,单位:分钟*/public  <T> void putAsync(T t, String key, int minute, final SHCachePutCallback callback) {if (t == null) {return;}Gson gson = new Gson();DiskCacheData cacheData = new DiskCacheData();cacheData.key = key;cacheData.delayTime = minute * 60000;cacheData.saveTime = System.currentTimeMillis();cacheData.jsonString = gson.toJson(t);Reservoir.putAsync(key, cacheData, new ReservoirPutCallback() {@Overridepublic void onSuccess() {callback.onSucceed();}@Overridepublic void onFailure(Exception e) {callback.onFailed();}});}/*** @param response 网络请求的数据*/public void putResponse(HttpResponse response, String key, int minute, final SHCachePutCallback callback) {if (response == null) {return;}DiskCacheData diskCacheData = new DiskCacheData();diskCacheData.key = key;diskCacheData.jsonString = response.getJson();diskCacheData.saveTime = System.currentTimeMillis();diskCacheData.delayTime = minute * 60000;Reservoir.putAsync(key, diskCacheData, new ReservoirPutCallback() {@Overridepublic void onSuccess() {if (callback != null){callback.onSucceed();}}@Overridepublic void onFailure(Exception e) {if (callback != null){callback.onFailed();}}});}/*** 异步获取缓存  普通方式getAsync getResponse专用于网络请求数据缓存** @param key 存储的key值 建议格式:userid + 对应模块英文*/public void getResponse(final String key, final SHCacheResponseCallBack callback) {try {if (!Reservoir.contains(key)) {callback.onCallBack(null);return;}Reservoir.getAsync(key, DiskCacheData.class, new ReservoirGetCallback<DiskCacheData>() {@Overridepublic void onSuccess(DiskCacheData diskCacheData) {if (diskCacheData == null || diskCacheData.jsonString == null) {callback.onCallBack(null);Log.e("getAsync:", "无缓存");return;}if (diskCacheData.isDue()) {delete(key);callback.onCallBack(null);Log.e("getAsync:", "超时删除");return;}HttpResponse response = HttpResponse.createResponse(diskCacheData.jsonString);callback.onCallBack(response);}@Overridepublic void onFailure(Exception e) {callback.onCallBack(null);}});} catch (IOException e) {e.printStackTrace();callback.onCallBack(null);}}public  <T> void getAsync(final String key, final Class dataClass, final SHCacheGetCallback<T> callback) {try {if (Reservoir.contains(key)) {Reservoir.getAsync(key, DiskCacheData.class, new ReservoirGetCallback<DiskCacheData>() {@Overridepublic void onSuccess(DiskCacheData diskCacheData) {if (diskCacheData == null || diskCacheData.jsonString == null) {callback.onCallBack(null);Log.e("getAsync:", "无缓存");return;}if (diskCacheData.isDue()) {delete(key);callback.onCallBack(null);Log.e("getAsync:", "超时删除");return;}Gson gson = new Gson();Object t = gson.fromJson(diskCacheData.jsonString, dataClass);callback.onCallBack((T) t);Log.e("getAsync:", "未超时获取");}@Overridepublic void onFailure(Exception e) {callback.onCallBack(null);Log.e("getAsync:", "失败");}});} else {callback.onCallBack(null);}} catch (IOException e) {e.printStackTrace();callback.onCallBack(null);}}/*** 删除对应key的缓存*/public void delete(String key) {try {if (Reservoir.contains(key)) {Reservoir.deleteAsync(key, null);}} catch (IOException e) {e.printStackTrace();}}public void deleteAsync(String key, ReservoirDeleteCallback callback) {Reservoir.deleteAsync(key, callback);}/*** 删除所有缓存*/public void clearAsync(ReservoirClearCallback callback) {Reservoir.clearAsync(callback);}public void clear() {Reservoir.clearAsync(null);}/*** 用于数据存储的数据类*/private class DiskCacheData {private String key;private long saveTime;private long delayTime;private String jsonString;public boolean isDue() {//用于超时判断return System.currentTimeMillis() > saveTime + delayTime;}}public interface SHCacheResponseCallBack {void onCallBack(HttpResponse response);}public interface SHCacheGetCallback<T> {void onCallBack(T t);}public interface SHCachePutCallback {void onSucceed();void onFailed();}
}

SHDiskCache说明:

举个例子:
结合我们的界面来使用一下这个类

ps:因为我们使用的是AsyncHttpClient,所以缓存的是HttpResponse,代码:

public void getResponse() { SHDiskCache.getInstance().getResponse(SHDiskCacheConstant.getCacheKey(), new SHDiskCache.SHCacheResponseCallBack() {@Overridepublic void onCallBack(HttpResponse response) {if (response == null) {//没有缓存的数据则去请求loadData();return;}handleResponse(response);//存在缓存则用于界面展示}});         }/*** 界面展示*/private void handleResponse(HttpResponse response) {List<Question> questionList = response.getAsList("list", Question.class);view.fillData(questionList);}/*** 进行数据请求并存储*/private void loadData() { RequestParams params = ResBox.commonRequestParams();ApiHttpClient.post(context, ResBox.getInstance().loadQuestionList(), params, new HttpResponseHandler(view) {@Overridepublic void onRequestSuccess(HttpResponse response) {SHDiskCache.getInstance().putResponse(response, SHDiskCacheConstant.getCacheKey(),    SHDiskCacheConstant.getCacheTime(), null);//存储}@Overridepublic void onRequestFail(HttpResponse response) { }});}
}

提供关于时间以及Key值的管理:

ublic class SHDiskCacheConstant {/* 缓存key 缓存时长  */private static final String QUESTION_CACHE = "QquestionCache";public static final int QUESTION_CACHE_CACHETIME = 60;public static String getCacheKey() {return  QUESTION_STATUS;}
  public static String getCacheTime() {return  QUESTION_CACHE_CACHETIME;}
}

硬盘缓存使用类SHDiskCache,缓存的基本操作、时长管理以及数据回调相关推荐

  1. 生成自定义时长的静音音频 | Java工具类

    生成一段自定义时长(精确到毫秒)的wav音频. 目录 Maven依赖 代码 参数说明和使用方法 总结 Maven依赖 <dependency><groupId>org</ ...

  2. 缓存处理类(MemoryCache结合文件缓存)

    想提升站点的性能,于是增加了缓存,但是站点不会太大,于是不会到分布式memcached的缓存和redis这个nosql库,于是自己封装了.NET内置的缓存组件 原先使用System.Web.Cachi ...

  3. 【Android 内存优化】Bitmap 内存缓存 ( Bitmap 缓存策略 | LruCache 内存缓存 | LruCache 常用操作 | 工具类代码 )

    文章目录 一.Bitmap 内存缓存策略 二.LruCache 内存缓存 三.LruCache 常用操作 四.LruCache 工具类 五.源码及资源下载 官方参考 : Google 官方提供的 内存 ...

  4. android 如何在线程缓存实体类

    今天,简单讲讲在线程里把数据缓存起来. 如果在线程里有一些类变量,在run的代码里循环给这些变量赋值,然后缓存在一个list链表里,最后变量链表会发现数据有的不对. 原因很简单,对于基本数据类型,可以 ...

  5. 缓存工具类MyCacheUtil

    MyCacheUtil.java package com.sunrise.jop.common.util;import java.io.File; import java.sql.Timestamp; ...

  6. android 图片缓存工具类,Android工具类系列-Glide图片缓存与圆角

    Glide的图片缓存和清除图片缓存 public class GlideCacheUtil { private static GlideCacheUtil inst; public static Gl ...

  7. php缓存实例,一个PHP缓存类实例

    一个PHP缓存类实例 发布于 2014-08-05 21:44:28 | 104 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hypertext Preproce ...

  8. php缓存类,PHP缓存类

    // +---------------------------------------------------------------------- // |缓存类 // +------------- ...

  9. php 高效缓存类,简单高效的文件缓存php类

    简单高效的文件缓存php类 class FileCache { public $keyPrefix = ''; public $cachePath = ''; public $cacheFileSuf ...

最新文章

  1. 神经网络中的权重初始化常用方法
  2. js最简单的几个特效_高阶函数不会用?教你JS中最实用的几个高阶函数用法
  3. 懂数学人的都认同:数学的本质[关联]万物(一)
  4. Silverlight Telerik控件学习:带CheckBox复选框的树形TreeView控件
  5. dns设置服务器版本信息,DNS设置方法
  6. CF-477C(Dreamoon and Strings) DP
  7. dubbo源码深度解析_scrapy框架通用爬虫、深度爬虫、分布式爬虫、分布式深度爬虫,源码解析及应用
  8. 为什么有的人开车舍不得开空调?车载空调耗油吗?
  9. oracle 算年级,oracle 查询年级,班级,班级人数;
  10. Spring Security(09)——Filter
  11. CC2530单片机开发
  12. 神经网络是什么,神经网络具体有什么用?
  13. tensorflow2.0(简介)
  14. linux离线安装jemalloc,jemalloc在linux上从安装到使用
  15. 联想340c笔记本cpu能升级吗_笔记本电脑可以升级CPU吗
  16. i9 10900K比9900K性能提升了多少?i9-10900K和i9-9900K区别对比评测 更多详情咨询世通兰陵王
  17. S32K144之ADC
  18. Unity导出的WebGL、网页前端、服务端以及硬件四级交互结构的实现(简单3d建模网页端物联网)
  19. uCOSii中的互斥信号量
  20. Mysql5.5 免安装版配置步骤

热门文章

  1. java怎么写函数_java构造函数怎么写
  2. 中国人的成功十要(台湾成功学大师:曾仕强)
  3. 不让IE浏览器打开后跳转到edge
  4. 释放AI视觉技术潜力,解码机器人“新姿势”
  5. FTPC修改登录界面英文,改中文登录界面
  6. 使用 Orika 实现bean 映射
  7. vue项目查看vue版本及cli版本
  8. 二、C++ complier works 编译器如何工作工作
  9. 戴尔科技集团助力中国石油大学打造现代数据中心
  10. 企业激励的3种模式分析与运用