4
我試圖緩存來自服務器的JSON請求,但是,他們錯誤地使用了Cache-Control頭等等(過去的所有內容都過期了)。我想覆蓋它,這樣無論服務器請求什麼,呼叫都可以緩存3個小時。那可能嗎? Volley的文檔是稀缺的。Android volley - 爲JSON請求覆蓋緩存超時
我試圖緩存來自服務器的JSON請求,但是,他們錯誤地使用了Cache-Control頭等等(過去的所有內容都過期了)。我想覆蓋它,這樣無論服務器請求什麼,呼叫都可以緩存3個小時。那可能嗎? Volley的文檔是稀缺的。Android volley - 爲JSON請求覆蓋緩存超時
您可以繼承JsonObjectRequest類並覆蓋parseNetworkResponse。您會注意到對HttpHeaderParser.parseCacheHeaders的調用 - 這是一個開始的好地方:]只需包裝此調用或將其替換並將您自己的虛擬緩存頭配置對象[使用您的專有客戶端緩存時間]提供給Response.success。
我在執行它看起來像這樣:
parseNetworkResponse
return Response.success(payload, enforceClientCaching(HttpHeaderParser.parseCacheHeaders(response), response));
與enforceClientCaching相關成員是
protected static final int defaultClientCacheExpiry = 1000 * 60 * 60; // milliseconds; = 1 hour
protected Cache.Entry enforceClientCaching(Cache.Entry entry, NetworkResponse response) {
if (getClientCacheExpiry() == null) return entry;
long now = System.currentTimeMillis();
if (entry == null) {
entry = new Cache.Entry();
entry.data = response.data;
entry.etag = response.headers.get("ETag");
entry.softTtl = now + getClientCacheExpiry();
entry.ttl = entry.softTtl;
entry.serverDate = now;
entry.responseHeaders = response.headers;
} else if (entry.isExpired()) {
entry.softTtl = now + getClientCacheExpiry();
entry.ttl = entry.softTtl;
}
return entry;
}
protected Integer getClientCacheExpiry() {
return defaultClientCacheExpiry;
}
它處理兩種情況:
因此,如果服務器開始發送,在未來到期正確的緩存頭,它仍然可以工作。
對不起,您從哪裏獲取Cache.Entry? – StackOverflowed
來自httpheaderparser.parsecacheheaders,如上所述 – Makibo
謝謝。所以我們不需要將服務器響應數據保存在數據庫中。這是真的? –