硬盘缓存使用类SHDiskCache,缓存的基本操作、时长管理以及数据回调
写这个主要还是用来记录一下,避免自己长时间不用后想不起来
之前项目里做数据缓存到本地,小的使用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,缓存的基本操作、时长管理以及数据回调相关推荐
- 生成自定义时长的静音音频 | Java工具类
生成一段自定义时长(精确到毫秒)的wav音频. 目录 Maven依赖 代码 参数说明和使用方法 总结 Maven依赖 <dependency><groupId>org</ ...
- 缓存处理类(MemoryCache结合文件缓存)
想提升站点的性能,于是增加了缓存,但是站点不会太大,于是不会到分布式memcached的缓存和redis这个nosql库,于是自己封装了.NET内置的缓存组件 原先使用System.Web.Cachi ...
- 【Android 内存优化】Bitmap 内存缓存 ( Bitmap 缓存策略 | LruCache 内存缓存 | LruCache 常用操作 | 工具类代码 )
文章目录 一.Bitmap 内存缓存策略 二.LruCache 内存缓存 三.LruCache 常用操作 四.LruCache 工具类 五.源码及资源下载 官方参考 : Google 官方提供的 内存 ...
- android 如何在线程缓存实体类
今天,简单讲讲在线程里把数据缓存起来. 如果在线程里有一些类变量,在run的代码里循环给这些变量赋值,然后缓存在一个list链表里,最后变量链表会发现数据有的不对. 原因很简单,对于基本数据类型,可以 ...
- 缓存工具类MyCacheUtil
MyCacheUtil.java package com.sunrise.jop.common.util;import java.io.File; import java.sql.Timestamp; ...
- android 图片缓存工具类,Android工具类系列-Glide图片缓存与圆角
Glide的图片缓存和清除图片缓存 public class GlideCacheUtil { private static GlideCacheUtil inst; public static Gl ...
- php缓存实例,一个PHP缓存类实例
一个PHP缓存类实例 发布于 2014-08-05 21:44:28 | 104 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hypertext Preproce ...
- php缓存类,PHP缓存类
// +---------------------------------------------------------------------- // |缓存类 // +------------- ...
- php 高效缓存类,简单高效的文件缓存php类
简单高效的文件缓存php类 class FileCache { public $keyPrefix = ''; public $cachePath = ''; public $cacheFileSuf ...
最新文章
- 神经网络中的权重初始化常用方法
- js最简单的几个特效_高阶函数不会用?教你JS中最实用的几个高阶函数用法
- 懂数学人的都认同:数学的本质[关联]万物(一)
- Silverlight Telerik控件学习:带CheckBox复选框的树形TreeView控件
- dns设置服务器版本信息,DNS设置方法
- CF-477C(Dreamoon and Strings) DP
- dubbo源码深度解析_scrapy框架通用爬虫、深度爬虫、分布式爬虫、分布式深度爬虫,源码解析及应用
- 为什么有的人开车舍不得开空调?车载空调耗油吗?
- oracle 算年级,oracle 查询年级,班级,班级人数;
- Spring Security(09)——Filter
- CC2530单片机开发
- 神经网络是什么,神经网络具体有什么用?
- tensorflow2.0(简介)
- linux离线安装jemalloc,jemalloc在linux上从安装到使用
- 联想340c笔记本cpu能升级吗_笔记本电脑可以升级CPU吗
- i9 10900K比9900K性能提升了多少?i9-10900K和i9-9900K区别对比评测 更多详情咨询世通兰陵王
- S32K144之ADC
- Unity导出的WebGL、网页前端、服务端以及硬件四级交互结构的实现(简单3d建模网页端物联网)
- uCOSii中的互斥信号量
- Mysql5.5 免安装版配置步骤