使用方法
很简单,两行代码搞定。
DataCache<Object> dataCache =
new DataCache<>(() -> mDao.getAll());
List<Object> = dataCache.getData()
其中() -> mDao.getAll()是超时的时候自动调用的接口。
假设你之前获取数据的方法是 getData() ,
那上述代码就应该改成 () -> getData()。
最后使用 dataCache.getData() 获取数据即可。
代码简单实现
/**
* 使用方法示例
* 初始化
* DataCache<Object> dataCache = new DataCache<>(() -> mDao.getAll());
* 读取缓存
* List<Object> = dataCache.getData()
* 如果你有多个缓存,你可以考虑使用 Map 结构来存储
* Map<String, DataCache<Object>> cacheMap = new HashMap<>();
*
* @param <T> 数据类型
* @author Zmaplex
* @version 0.1
*/
public class DataCache<T> {
/**
* 超时时间,单位秒
* 可以使用如下构造器,设置超时时间
* DataCache(DataCacheCall<T> dataCacheCall, int outTime)
*/
private int outTime = 100;
/**
* 最后修改时间。
* 每次读取数据的时候,自动更新这个字段。
*/
private long lastModify = 0;
/**
* 通用数据列表,用作缓存
*/
private List<T> data = new ArrayList<>();
/**
* 数据缓存回调接口
* 当超时的时候,将自动调用 onCallUpdate 更新 data 数据。
*/
private DataCacheCall<T> dataCacheCall;
/**
* 构造器
*
* @param dataCacheCall 数据缓存回调
*/
public DataCache(DataCacheCall<T> dataCacheCall) {
this.dataCacheCall = dataCacheCall;
}
/**
* 构造器
*
* @param dataCacheCall 数据缓存回调
* @param outTime 超时时间,单位秒
*/
public DataCache(DataCacheCall<T> dataCacheCall, int outTime) {
this.dataCacheCall = dataCacheCall;
this.outTime = outTime;
}
/**
* 返回缓存数据
* 超时的时候会自动调用回调接口更新数据
*
* @return 返回列表数据
*/
public List<T> getData() {
long during = (System.currentTimeMillis() - lastModify) / 1000;
if (during > outTime) {
data = dataCacheCall.onCallUpdate();
}
lastModify = System.currentTimeMillis();
return data;
}
/**
* @param <T> 泛型
*/
private interface DataCacheCall<T> {
List<T> onCallUpdate();
}
}