public final class Cache extends Objectimplements Closeable , Flushable
To measure cache effectiveness, this class tracks three statistics:
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 and CacheControl that address the use cases above.
| Modifier and Type | Method and Description |
|---|---|
void |
close()
|
void |
delete()
Closes the cache and deletes all of its stored values.
|
File |
directory()
|
void |
evictAll()
Deletes all values stored in the cache.
|
void |
flush()
|
int |
hitCount()
|
void |
initialize()
Initialize the cache.
|
boolean |
isClosed()
|
long |
maxSize()
|
int |
networkCount()
|
int |
requestCount()
|
long |
size()
|
Iterator |
urls()
Returns an iterator over the URLs in this cache.
|
int |
writeAbortCount()
|
int |
writeSuccessCount()
|
public Cache(Filedirectory, long maxSize)
public void initialize()
throws IOException
The initialization time may vary depending on the journal file size and the current actual cache size. The application needs to be aware of calling this function during the initialization phase and preferably in a background worker thread.
Note that if the application chooses to not call this method to initialize the cache. By default, the okhttp will perform lazy initialization upon the first usage of the cache.
IOException
public void delete()
throws IOException
IOException
public void evictAll()
throws IOException
IOException
public Iterator<String > urls() throws IOException
ConcurrentModificationException, but if new responses are added while iterating, their URLs will not be returned. If existing responses are evicted during iteration, they will be absent (unless they were already returned).
The iterator supports Iterator
IOException
public int writeAbortCount()
public int writeSuccessCount()
public long size()
throws IOException
IOException
public long maxSize()
public void flush()
throws IOException
flush in interface
Flushable
IOException
public void close()
throws IOException
close in interface
Closeable
close in interface
AutoCloseable
IOException
public Filedirectory()
public boolean isClosed()
public int networkCount()
public int hitCount()
public int requestCount()