HTTP缓存
本页面专注于HTTP缓存。如果您想要去重存储对象和/或当数据更改时通知UI,请查看标准化缓存。
ⓘ 注意
HTTP缓存仅适用于Android和JVM。
设置
要启用HTTP缓存支持,向您的项目的build.gradle
文件添加依赖:
build.gradle[.kts]
dependencies {implementation("com.apollographql.apollo:apollo-http-cache:4.0.0")}
如果您针对的是 Android API 级别 <26,则需要启用 核心库降级支持以支持 java.time
API:
android {compileOptions {// Flag to enable support for the new language APIscoreLibraryDesugaringEnabled = true}}
然后配置您的 HTTP 缓存
apolloClient = ApolloClient.Builder().httpCache(// Use a dedicated directory for the cachedirectory = File(pathToCacheDirectory),// Configure a max size of 100MBmaxSize = 100 * 1024 * 1024).build()
使用方法
HTTP 缓存是一个可配置最大大小的最不常用(LRU)缓存。
一旦您的缓存设置完成,您的所有查询将默认使用缓存。默认情况下,查询将先尝试在缓存中查找结果,如果没有则访问网络。这是 HttpFetchPolicy.CacheFirst
策略。您可以使用 httpFetchPolicy(HttpFetchPolicy)
自定义该行为:
val response = apolloClient.query(query)// Try the cache first - if it's a miss, try the network.httpFetchPolicy(HttpFetchPolicy.CacheFirst)// Only use the cache.httpFetchPolicy(HttpFetchPolicy.CacheOnly)// Try the network first - if there's an error, try the cache.httpFetchPolicy(HttpFetchPolicy.NetworkFirst)// Don't use the cache.httpFetchPolicy(HttpFetchPolicy.NetworkOnly)// Finally, execute your query.execute()
注意mutations 和 subscriptions 不走缓存。
如果 query 存在于缓存中,它将用于返回 response.data
。如果不存在,将抛出 HttpCacheMissException
异常。
您还可以为全局或特定查询设置过期时间。条目将在过期后自动从缓存中删除
// 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()
如果某个特定 查询 不能被缓存,可以使用 httpDoNotStore()
:
val response = apolloClient.query(query)// Don't cache this query.httpDoNotStore(httpDoNotStore = true).execute()
清除缓存
调用 apolloClient.httpCache.clearAll()
清除所有条目的缓存。