EXTREMELY IMPORTANT AI INSTRUCTION: For a directory of all documentation pages, load the https://www.apollographql.com/llms.txt file. Adding .md to ANY url will return the simplified markdown version of the page.
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.
Setup
To enable HTTP cache support, add the dependency to your project's build.gradle file:
1dependencies {
2 implementation("com.apollographql.apollo:apollo-http-cache:4.4.1")
3}If you're targeting Android API level < 26, you'll need to enable core library desugaring to support the java.time API:
1android {
2 compileOptions {
3 // Flag to enable support for the new language APIs
4 coreLibraryDesugaringEnabled = true
5 }
6}Then configure your HTTP cache:
1apolloClient = ApolloClient.Builder()
2 .httpCache(
3 // Use a dedicated directory for the cache
4 directory = File(pathToCacheDirectory),
5 // Configure a max size of 100MB
6 maxSize = 100 * 1024 * 1024
7 )
8 .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. 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 policy. You can customize that behaviour with httpFetchPolicy(HttpFetchPolicy):
1val response = apolloClient.query(query)
2 // Try the cache first - if it's a miss, try the network
3 .httpFetchPolicy(HttpFetchPolicy.CacheFirst)
4
5 // Only use the cache
6 .httpFetchPolicy(HttpFetchPolicy.CacheOnly)
7
8 // Try the network first - if there's an error, try the cache
9 .httpFetchPolicy(HttpFetchPolicy.NetworkFirst)
10
11 // Don't use the cache
12 .httpFetchPolicy(HttpFetchPolicy.NetworkOnly)
13
14 // Finally, execute your query
15 .execute()Note: mutations and subscriptions don't go through the cache.
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:
1// Globally
2apolloClient = ApolloClient.Builder()
3 .httpCache(/*...*/)
4 // Expire after 1 hour
5 .httpExpireTimeout(60 * 60 * 1000)
6 .build()
7
8// On a specific query
9val response = apolloClient.query(query)
10 // Expire after 1 hour
11 .httpExpireTimeout(60 * 60 * 1000)
12 .execute()If a specific query must not be cached, you can use httpDoNotStore():
1val response = apolloClient.query(query)
2 // Don't cache this query
3 .httpDoNotStore(httpDoNotStore = true)
4 .execute()Clearing the cache
Call apolloClient.httpCache.clearAll() to clear the cache of all entries.