也为 oleksandr_yefremov 和 skyfishjy +1,并在此处提供适用于 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 自动从缓存中快速呈现,无需加载器。
当然,这并不符合所有要求。YMMV