public class CustomRequest extends JsonObjectRequest {
public CustomRequest(String url, JSONObject params,
Listener<JSONObject> listener, ErrorListener errorListener)
throws JSONException {
super(Method.POST,url, params, listener,
errorListener);
this.setShouldCache(Boolean.TRUE);
}
}
我希望这段代码足以让我获得响应的隐式缓存。我不确定它是否有效,因为我在发送请求时假设:
它会首先命中缓存并将其发送到 onresponse
然后当结果从远程服务器传来时,它会将其提供给 onresponse
Update:
我想出了如何手动检索缓存并将其重建为 JSONObject 并通过 OnResponse 函数发送它,但考虑到存在隐式缓存,这似乎效率不高。 JsonObjectRequest 类应返回 JSONObject 作为缓存条目,而不是原始响应数据。
但我仍然有兴趣知道我是否犯了一些错误。
歧义完全是由于缺乏文档造成的,所以如果我遗漏了一些非常明显的东西,我深表歉意。
看到这个答案——使用 Google 的 Volley 设置缓存过期策略
这意味着 Volley 仅根据标头“Cache-Control”然后“Expires”、“maxAge”来决定是否缓存响应。
你可以做的就是改变这个方法com.android.volley.toolbox.HttpHeaderParser.parseCacheHeaders(NetworkResponse response)
并忽略这些标头,设置entry.softTtl
and entry.ttl
字段为任何适合您的值,并在请求类中使用您的方法。这是一个例子:
/**
* Extracts a {@link Cache.Entry} from a {@link NetworkResponse}.
* Cache-control headers are ignored. SoftTtl == 3 mins, ttl == 24 hours.
* @param response The network response to parse headers from
* @return a cache entry for the given response, or null if the response is not cacheable.
*/
public static Cache.Entry parseIgnoreCacheHeaders(NetworkResponse response) {
long now = System.currentTimeMillis();
Map<String, String> headers = response.headers;
long serverDate = 0;
String serverEtag = null;
String headerValue;
headerValue = headers.get("Date");
if (headerValue != null) {
serverDate = HttpHeaderParser.parseDateAsEpoch(headerValue);
}
serverEtag = headers.get("ETag");
final long cacheHitButRefreshed = 3 * 60 * 1000; // in 3 minutes cache will be hit, but also refreshed on background
final long cacheExpired = 24 * 60 * 60 * 1000; // in 24 hours this cache entry expires completely
final long softExpire = now + cacheHitButRefreshed;
final long ttl = now + cacheExpired;
Cache.Entry entry = new Cache.Entry();
entry.data = response.data;
entry.etag = serverEtag;
entry.softTtl = softExpire;
entry.ttl = ttl;
entry.serverDate = serverDate;
entry.responseHeaders = headers;
return entry;
}
在您的 Request 类中使用此方法,如下所示:
public class MyRequest extends com.android.volley.Request<MyResponse> {
...
@Override
protected Response<MyResponse> parseNetworkResponse(NetworkResponse response) {
String jsonString = new String(response.data);
MyResponse MyResponse = gson.fromJson(jsonString, MyResponse.class);
return Response.success(MyResponse, HttpHeaderParser.parseIgnoreCacheHeaders(response));
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)