我对编码/ android开发比较陌生,我正在尝试在我的应用程序中首次实现缓存。该应用程序当前每次打开时都会进行数据库调用,以获取一些易于在会话之间缓存和存储的基本信息。
我认为最简单的解决方案是按此处概述的那样通过改造实现缓存:https://medium.com/mindorks/caching-with-retrofit-store-responses-offline-71439ed32fda我希望能够对其进行修改,以检查缓存中是否有未过期的数据,并且仅进行数据库调用数据是否过期。如果电话处于离线状态,则与使用缓存相反。
到目前为止,这就是我拥有的
OkHttpClient = OkHttpClient.Builder().connectTimeout(timeout.toLong(), TimeUnit.SECONDS).run {
context?.let { context ->
cache(Cache(context.cacheDir, (5 * 1024 * 1024).toLong()))
addInterceptor {
it.proceed(it.request().newBuilder().header("Cache-Control", "private, only-if-cached, max-stale=" + 60*60*24*28).build())
}
我希望这可以检查缓存中是否有数据,然后如果没有,则进行调用,但是我从数据库中收到了504错误响应。我认为我缺少一些关键步骤,但是我不确定它们是什么。任何帮助都会很棒。谢谢
答案 0 :(得分:1)
我对每个拦截器如何工作的来龙去脉并不十分熟悉,但是我一直在摆弄/搜索,直到发现使用两个拦截器对我有用的东西。我的实现的一部分是能够强制刷新,这是您在第一个拦截器中看到的布尔值
科特琳:
...
val cacheControl = CacheControl.Builder().maxAge(timeUnit.toSeconds(cacheDuration), TimeUnit.SECONDS).build()
cache(Cache(File(context?.cacheDir, "http-cache"), CACHE_SIZE.toLong()))
// Adding both interceptors ensures the FORCE_NETWORK to call the api through the network and override the cache with new data
addInterceptor { chain -> chain.proceed(chain.request().newBuilder().header("Cache-Control", if (!useCache) CacheControl.FORCE_NETWORK.toString() else cacheControl.toString()).build()) }
//The 'Pragma' header key has a no-cache value in some APIs so it must be removed for us to cache it
addNetworkInterceptor { chain -> chain.proceed(chain.request()).newBuilder().removeHeader("Pragma").header("Cache-Control", cacheControl.toString()).build() }
...