gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 12:53:03 25 4
gpt4 key购买 nike

我是编码/ 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com