class Cache : Closeable, Flushable
Caches HTTP and HTTPS responses to the filesystem so they may be reused, saving time and bandwidth.
To measure cache effectiveness, this class tracks three statistics:
Sometimes a request will result in a conditional cache hit. If the cache contains a stale copy of
the response, the client will issue a conditional GET. The server will then send either
the updated response if it has changed, or a short 'not modified' response if the client's copy
is still valid. Such responses increment both the network count and hit count.
The best way to improve the cache hit rate is by configuring the web server to return cacheable responses. Although this client honors all HTTP/1.1 (RFC 7234) cache headers, it doesn't cache partial responses.
In some situations, such as after a user clicks a 'refresh' button, it may be necessary to skip
the cache, and fetch data directly from the server. To force a full refresh, add the no-cache
directive:
Request request = new Request.Builder()
.cacheControl(new CacheControl.Builder().noCache().build())
.url("http://publicobject.com/helloworld.txt")
.build();
If it is only necessary to force a cached response to be validated by the server, use the more
efficient max-age=0 directive instead:
Request request = new Request.Builder()
.cacheControl(new CacheControl.Builder()
.maxAge(0, TimeUnit.SECONDS)
.build())
.url("http://publicobject.com/helloworld.txt")
.build();
Sometimes you'll want to show resources if they are available immediately, but not otherwise.
This can be used so your application can show something while waiting for the latest data to be
downloaded. To restrict a request to locally-cached resources, add the only-if-cached
directive:
Request request = new Request.Builder()
.cacheControl(new CacheControl.Builder()
.onlyIfCached()
.build())
.url("http://publicobject.com/helloworld.txt")
.build();
Response forceCacheResponse = client.newCall(request).execute();
if (forceCacheResponse.code() != 504) {
// The resource was cached! Show it.
} else {
// The resource was not cached.
}
This technique works even better in situations where a stale response is better than no response.
To permit stale cached responses, use the max-stale directive with the maximum staleness in
seconds:
Request request = new Request.Builder()
.cacheControl(new CacheControl.Builder()
.maxStale(365, TimeUnit.DAYS)
.build())
.url("http://publicobject.com/helloworld.txt")
.build();
The CacheControl class can configure request caching directives and parse response caching directives. It even offers convenient constants CacheControl.FORCE_NETWORK and CacheControl.FORCE_CACHE that address the use cases above.
Cache(directory: File, maxSize: Long)
|
val directory: File |
|
val isClosed: Boolean |
fun close(): Unit |
|
fun delete(): Unit
Closes the cache and deletes all of its stored values. This will delete all files in the cache directory including files that weren't created by the cache. |
|
fun evictAll(): Unit
Deletes all values stored in the cache. In-flight writes to the cache will complete normally, but the corresponding responses will not be stored. |
|
fun flush(): Unit |
|
fun hitCount(): Int |
|
fun initialize(): Unit
Initialize the cache. This will include reading the journal files from the storage and building up the necessary in-memory cache information. |
|
fun maxSize(): Long
Max size of the cache (in bytes). |
|
fun networkCount(): Int |
|
fun requestCount(): Int |
|
fun size(): Long |
|
fun urls(): MutableIterator<String>
Returns an iterator over the URLs in this cache. This iterator doesn't throw
|
|
fun writeAbortCount(): Int |
|
fun writeSuccessCount(): Int |
fun Response.hasVaryAll(): Boolean
Returns true if a Vary header contains an asterisk. Such responses cannot be cached. |
|
fun key(url: HttpUrl): String |
|
fun Response.varyHeaders(): Headers
Returns the subset of the headers in this's request that impact the content of this's body. |
|
fun varyMatches(cachedResponse: Response, cachedRequest: Headers, newRequest: Request): Boolean
Returns true if none of the Vary headers have changed between cachedRequest and newRequest. |