android - 仅当缓存时发生错误:通过改型实现缓存

标签 android caching kotlin

我是编码/ android开发的新手,我试图在我的应用程序中第一次实现缓存。该应用程序当前每次打开时都会进行数据库调用,以获取一些易于在 session 之间缓存和存储的基本信息。

我认为最简单的解决方案是按此处概述的那样通过改造实现缓存: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错误响应。我认为我缺少一些关键步骤,但是我不确定它们是什么。任何帮助都会很棒。谢谢

最佳答案

我对每个拦截器如何工作的来龙去脉并不十分熟悉,但是我一直在摆弄/搜索,直到发现使用两个拦截器对我有用的东西。我的实现的一部分是能够强制刷新,这是您在第一个拦截器中看到的 bool(boolean) 值

Kotlin :

...
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() }
...

关于android - 仅当缓存时发生错误:通过改型实现缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56430911/

相关文章:

c - 编写一个测量缓存 block 大小的 C 程序

typescript - RxjS shareReplay : how to reset its value?

android - RetryWhen与Single一起使用时出现一些问题

android - 华为设备上视频的 APEZProvider RuntimeException

android - 使用 Android Intent 打开 PDF 文件

javascript - 浏览器如何在单页应用程序上缓存index.html

java - Android 库在捕获所有 Throwable 的 try block 内抛出异常

java - 为什么我的单例是同步的,但它被创建了很多次?

android - 在 web-view react-native 上禁用缩放?

Android Oreo 电池优化导致 FCM 延迟