HTTP cache
This page focuses on the HTTP cache. If you want to deduplicate the storage of your objects and/or notify your UI when your data changes, take a look at the normalized cache instead.
ℹ️ The HTTP cache is only available on the JVM.
Setup
To enable HTTP cache support, add the dependency to your project's build.gradle
file:
dependencies {implementation("com.apollographql.apollo3:apollo-http-cache:4.0.0-beta.5")}
If you're targeting Android API level < 26, you'll need to enable core library desugaring to support the java.time
API:
android {compileOptions {// Flag to enable support for the new language APIscoreLibraryDesugaringEnabled = true}}
Then configure your HTTP cache:
apolloClient = ApolloClient.Builder().httpCache(// Use a dedicated directory for the cachedirectory = File(pathToCacheDirectory),// Configure a max size of 100MBmaxSize = 100 * 1024 * 1024).build()
Usage
The HTTP cache is a least recently used (LRU) cache with a configurable max size.
Once your cache setup is complete, the cache will be used by default by all your queries (mutations are never cached). By default, queries will try to find a result in the cache first and go the network if it's not there. This is the HttpFetchPolicy.CacheFirst
. You can customize that behaviour with httpFetchPolicy(HttpFetchPolicy)
:
val response = apolloClient.query(query)// Don't use the cache.httpFetchPolicy(HttpFetchPolicy.NetworkOnly)// Or only use the cache.httpFetchPolicy(HttpFetchPolicy.CacheOnly)// Finally, execute your query.execute()
If the query is present in cache, it will be used to return response.data
. If not, a HttpCacheMissException
will be thrown.
You can also set an expiration time either globally or for specific queries. The entries will automatically be removed from the cache after the expiration time:
// GloballyapolloClient = ApolloClient.Builder().httpCache(/*...*/)// Expire after 1 hour.httpExpireTimeout(60 * 60 * 1000).build()// On a specific queryval response = apolloClient.query(query)// Expire after 1 hour.httpExpireTimeout(60 * 60 * 1000).execute()
If a specific query must not be cached, you can use httpDoNotStore()
:
val response = apolloClient.query(query)// Don't cache this query.httpDoNotStore(httpDoNotStore = true).execute()
Clearing the cache
Call apolloClient.httpCache.clearAll()
to clear the cache of all entries.