+1 oleksandr_yefremov和skyfishjy同时更换HttpHeaderParser.parseCacheHeaders(response)
,这里提供一个具体的,可重用的类适用于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()com es从上面的oleksandr_yefremov答案中获得。在生成的json可以缓存3分钟(活动)和24小时(过期但仍然可用)的任何地方使用CachingStringRequest类。样品请求:
CachingStringRequest stringRequest = new CachingStringRequest(MY_API_URL, callback);
和回调对象的onResponse()函数中,解析JSON。设置你想要的任何缓存限制 - 你可以参数化来为每个请求添加自定义到期。
为了好玩,在一个简单的应用程序中尝试下载json并呈现下载的信息。在第一次成功下载之后填满缓存,在缓存生效的同时更改方向(观看实时缓存命中时不会下载),观看快速渲染。现在杀死应用程序,等待3分钟,使缓存命中过期(但不能24小时从缓存中删除),启用飞行模式,然后重新启动应用程序。 Volley错误回调将发生,并且“成功”的onResponse()回调将从缓存数据中发生,允许您的应用既呈现内容,也知道/警告它来自过期缓存。
这种缓存的一种用途是避免装载机和其他处理方向改变的方式。如果请求通过一个Volley单例,并且结果被缓存,那么通过方向更改发生的刷新将从缓存中快速呈现,由Volley自动完成,而不需要Loader。
当然,这不符合所有要求。 YMMV
这是否意味着缓存将超越,onDestroy?所以下次创建应用程序时,它会从缓存中获取? – gaara87
是的,缓存不仅保存在内存中,还保存在磁盘上(详情请参阅DiskBasedCache类)。作为一个快速测试,加载一些数据,退出你的应用程序,关闭WiFi或3G,然后再次输入你的应用程序。您还可以在mMaxCacheSizeInBytes字段中指定缓存大小。 –
是的,它在我进入应用程序时缓存,但当我退出应用程序并返回到应用程序时,从缓存中获取返回null。因此,它是否存在于活动生命周期之间。 – gaara87