ony-if-cached错误:用retrofit实现缓存。

我是一个比较新的编码android开发,我正在尝试在我的应用程序中首次实现缓存。目前,该应用程序每次打开时都会调用数据库来获取一些基本信息,这些信息可以很容易地在会话之间被缓存和存储。

我想最简单的解决方案就是像这里概述的那样,通过改造来实现缓存。https:/medium.commindorkscaching-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错误响应。我认为我漏掉了一些关键步骤,但我不确定它们是什么。任何帮助将是巨大的。谢谢你的帮助

解决方案:

我对每个拦截器的工作原理的来龙去脉不是很熟悉,但我摸索了一下,直到我找到了使用两个拦截器为我工作的东西。我的部分实现是为了能够强制刷新,也就是你在第一个拦截器中看到的布尔值。

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

给TA打赏
共{{data.count}}人
人已打赏
解决方案

Jackson - 填充嵌套的父ID

2022-5-14 9:00:09

解决方案

通过quantmod将股票数据循环连接在一起。

2022-5-14 9:00:12

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索