Я пытаюсь использовать кэширование, используя Retrofit и OkHttp.
Я добавляю этот перехватчик в конструктор OkHttp следующим образом.
@Provides
@Singleton
@TokenHttpClient
internal fun provideTokenOkHttpClient(
@BaseHttpClient okHttpClient: OkHttpClient,
cacheInterceptor: NetworkCacheInterceptor): OkHttpClient {
return okHttpClient.newBuilder()
.addInterceptor(cacheInterceptor)
.build()
И перехватчик выглядит так:
class NetworkCacheInterceptor(val context: Context): Interceptor {
@Throws(IOException::class)
override fun intercept(chain: Interceptor.Chain): Response {
var response = chain.request()
response = if (hasNetwork(context))
response.newBuilder()
.removeHeader("Pragma")
.removeHeader("Cache-Control")
.header("Cache-Control",
"public, max-age=${CacheControl.Builder().maxAge(30, TimeUnit.DAYS).build()}")
.build()
else {
response.newBuilder()
.removeHeader("Pragma")
.removeHeader("Cache-Control")
.header("Cache-Control",
"public, only-if-cached, max-stale=${CacheControl.Builder().maxAge(30, TimeUnit.DAYS).build()}")
.cacheControl(CacheControl.FORCE_CACHE)
.build()
response
}
return chain.proceed(response)
}
}
Этот способ реализации позволяет сохранять ответы вcache
папка.Но он не работает в автономном режиме.Я устал разделять перехватчики и добавлять кеширование как networkInterceptor и автономный перехватчик как обычный перехватчик, но это не сработало.В этом случае кэш не был сохранен.
Когда я проверяю кэшированные файлы, я вижу следующие заголовки:
GET
0
HTTP/1.1 200
15
Access-Control-Expose-Headers: value
Cache-Control: no-cache
ETag: "01785cb0981d28aa96d58e491dbd6873e"
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: SAMEORIGIN
Referrer-Policy: no-referrer
Content-Type: application/json;charset=UTF-8
Date: Tue, 21 May 2019 07:50:51 GMT
Transfer-Encoding: chunked
Content-Encoding: gzip
OkHttp-Sent-Millis: 1558425050896
OkHttp-Received-Millis: 1558425050928
Есть идеи?Чего мне не хватает?