XUtils3.0 解决不缓存问题
来源:互联网 发布:php 原生态链接数据库 编辑:程序博客网 时间:2024/05/17 02:48
XUtils3.0 解决不缓存问题
xutils3.0是一次彻底的重构, api发生了很大变化, 但是仍然保持着xUtils一贯的简介风格, 并且新的api更加简单, 更具扩展性。参考sample写的案例发现不走缓存(onCache)。原因可能为以下两种:
1. 未设置缓存
2. 接口返回头expires设置过期时间为过去时间(即不缓存)
1. 未设置缓存
通过调用 setCacheMaxAge()设置缓存时间,单位毫秒
BaiduParams params = new BaiduParams(); params.wd = "xUtils"; // 默认缓存存活时间, 单位:毫秒.(如果服务没有返回有效的max-age或Expires) params.setCacheMaxAge(1000 * 60); Callback.Cancelable cancelable // 使用CacheCallback, xUtils将为该请求缓存数据. = x.http().get(params, new Callback.CacheCallback<String>() { private boolean hasError = false; private String result = null; @Override public boolean onCache(String result) { // 得到缓存数据, 缓存过期后不会进入这个方法. // 如果服务端没有返回过期时间, 参考params.setCacheMaxAge(maxAge)方法. // // * 客户端会根据服务端返回的 header 中 max-age 或 expires 来确定本地缓存是否给 onCache 方法. // 如果服务端没有返回 max-age 或 expires, 那么缓存将一直保存, 除非这里自己定义了返回false的 // 逻辑, 那么xUtils将请求新数据, 来覆盖它. // // * 如果信任该缓存返回 true, 将不再请求网络; // 返回 false 继续请求网络, 但会在请求头中加上ETag, Last-Modified等信息, // 如果服务端返回304, 则表示数据没有更新, 不继续加载数据. // this.result = result; return false; // true: 信任缓存数据, 不在发起网络请求; false不信任缓存数据. } @Override public void onSuccess(String result) { // 注意: 如果服务返回304或 onCache 选择了信任缓存, 这里将不会被调用, // 但是 onFinished 总会被调用. this.result = result; } @Override public void onError(Throwable ex, boolean isOnCallback) { hasError = true; Toast.makeText(x.app(), ex.getMessage(), Toast.LENGTH_LONG).show(); if (ex instanceof HttpException) { // 网络错误 HttpException httpEx = (HttpException) ex; int responseCode = httpEx.getCode(); String responseMsg = httpEx.getMessage(); String errorResult = httpEx.getResult(); // ... } else { // 其他错误 // ... } } @Override public void onCancelled(CancelledException cex) { Toast.makeText(x.app(), "cancelled", Toast.LENGTH_LONG).show(); } @Override public void onFinished() { if (!hasError && result != null) { // 成功获取数据 Toast.makeText(x.app(), result, Toast.LENGTH_LONG).show(); } } });
2. 接口返回头expires设置过期时间为过去时间(即不缓存)
在使用注解模板时,可以在responseParser里面手动缓存
public class JsonResponseParser implements ResponseParser { private UriRequest request; @Override public void checkResponse(UriRequest request) throws Throwable { //请求网络时候走这里 this.request = request; } @Override public Object parse(Type resultType, Class<?> resultClass, String result) throws Throwable { //解析,缓存先走这里,如果缓存没有找到或者未设置缓存,那么再走checkResponse //如果服务器接口返回缓存过期时间为过去时间(即不缓存)那么手动设置过期时间为 //System.currentTimeMillis() + request.getParams().getCacheMaxAge() if (request != null && !TextUtils.isEmpty(result) && request.getExpiration() < System.currentTimeMillis()) { DiskCacheEntity entity = new DiskCacheEntity(); entity.setKey(request.getCacheKey()); entity.setLastAccess(System.currentTimeMillis()); entity.setEtag(request.getETag());// entity.setExpires(request.getExpiration()); entity.setExpires(System.currentTimeMillis() + request.getParams().getCacheMaxAge()); entity.setLastModify(new Date(request.getLastModified())); entity.setTextContent(result); LruDiskCache.getDiskCache(request.getParams().getCacheDirName()).put(entity); } if (resultClass == List.class) { // fastJson 解析: return JSON.parseArray(result, (Class<?>) ParameterizedTypeUtil.getParameterizedType(resultType, List.class, 0)); } else { // fastjson 解析: return JSON.parseObject(result, resultClass); } }}
感谢wyouflf的帮助
1 0
- XUtils3.0 解决不缓存问题
- Xutils3.0网络带缓存的封装
- Xutils3图片缓存
- 解决因浏览器缓存不刷新网页的问题
- 解决IE浏览器下缓存不刷新问题。
- XUtils3.0
- xutils3.0
- jquery 请求ie缓存,数据不更新的问题【ajax禁用缓存解决ie数据不更新的问题】
- jquery 请求ie缓存,数据不更新的问题【ajax禁用缓存解决ie数据不更新的问题】
- jquery 请求ie缓存,数据不更新的问题【ajax禁用缓存解决ie数据不更新的问题】
- jquery 请求ie缓存,数据不更新的问题【ajax禁用缓存解决ie数据不更新的问题】
- ajax 解决缓存问题
- JSP解决缓存问题
- 解决缓存问题
- 解决ajax 缓存问题。
- 解决计算机缓存问题
- Ajax解决缓存问题
- ajax解决缓存问题
- The Java™ Tutorials — Generics :Type Inference 类型推断
- 题 新建文档(有点乱)
- android学习视频
- C++关键字-const与volatile限定说明符
- Splunk 模式的中国践行者——日志易让日志分析更容易
- XUtils3.0 解决不缓存问题
- tomcat7+jdk的keytool生成证书 配置https
- android 常用代码片段
- 软件定义数据中心在国家电网的应用实践
- Java安全之对称加密、非对称加密、数字签名
- PS教程!手把手教你绘制超写实的咖啡泡沫效果图
- Jboss7中使用JMS
- Java加密技术
- JS学习(二)