对oleksandr_yefremov和skyfishjy点赞,并在此提供一个具体的、可重复使用的类,适用于JSON或其他基于字符串的API:
public class CachingStringRequest extends StringRequest {
public CachingStringRequest(int method, String url, Response.Listener<String> listener, Response.ErrorListener errorListener) {
super(method, url, listener, errorListener);
}
public CachingStringRequest(String url, Response.Listener<String> listener, Response.ErrorListener errorListener) {
super(url, listener, errorListener);
}
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response) {
String parsed;
try {
parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
} catch (UnsupportedEncodingException e) {
parsed = new String(response.data);
}
return Response.success(parsed, parseIgnoreCacheHeaders(response));
}
}
函数parseIgnoreCacheHeaders()来源于上面oleksandr_yefremov的答案。在任何结果json可以缓存3分钟(实时)和24小时(过期但仍可用)的地方使用CachingStringRequest类。一个示例请求:
CachingStringRequest stringRequest = new CachingStringRequest(MY_API_URL, callback)
在回调对象的onResponse()函数内解析json。设置任何缓存限制,你可以参数化以添加每个请求的自定义到期时间。尝试在一个简单的应用程序中下载json并呈现已下载信息,填充缓存与第一次成功下载,观察当缓存处于活动状态时更改方向的快速渲染(给定活动缓存命中不会发生下载)。现在杀死应用程序,等待3分钟使缓存命中过期(但不是24小时从缓存中删除),启用飞行模式并重新启动应用程序。Volley错误回调将发生,并且来自缓存数据的"成功"onResponse()回调也将发生,让你的应用程序能够呈现内容并知道/警告它来自过期的缓存。这种缓存的一种用途是消除加载器和处理方向更改的其他手段。如果一个请求通过Volley单例进行,结果被缓存,那么通过方向更改进行的刷新将由Volley自动快速地从缓存中呈现,而无需使用加载器。当然,这并不适合所有要求。你的情况可能有所不同。
(+177 ) [687] cache-hit-parsed
177毫秒用于重新解析响应。 - Brett Duncavage