如何使用Retrofit和OKHttp在下次请求时使缓存路由无效/强制更新?

Sha*_*aun 9 android caching retrofit okhttp

我正在使用OKHttp客户端的Retrofit来缓存来自JSON API的响应.

这很好用.

但是,如果我在设备上执行导致数据在服务器上更新的操作,我需要一种方法来"使某个特定路由无效",以确保下次请求此数据时,它将从服务器再次而不是现在过时的缓存版本.

目前,我通过在请求的Cache-Control标头中显式调用带有"no-cache"标志的新路由来解决这个问题,但是这迫使我在需要之前下载新数据,如果需要,可能会多次下载采取多个操作,只是为了使缓存保持最新.

有没有办法在我的改造/ OKhttp客户端中标记路由/方法,因为缓存已过期,需要在下次请求时通过网络进行强制更新?

whl*_*hlk 12

使用retrofit2和OkHttp3,您可以通过向API方法定义参数添加Cache-Control标头来强制执行新响应:

@GET("ws/something")
Something getSomething(@Header("Cache-Control") String cacheControl);
Run Code Online (Sandbox Code Playgroud)

然后在给你打电话时要么提供null(可能)缓存版本,要么"no-cache"提供实时版本:

myApi.getSomething(forceRefresh ? "no-cache" : null);
Run Code Online (Sandbox Code Playgroud)

  • 很棒的解决方案! (2认同)
  • 这不会缓存刷新的数据,我们如何缓存刷新数据 (2认同)

Esp*_*dal 7

现在可以通过使用该Cache.urls()函数在OkHttp中实现.正如文件所说:

迭代器支持Iterator.remove().从迭代器中删除URL会从缓存中驱逐相应的响应.用它来驱逐选定的回复.

这已于2014年12月下旬合并为主人,似乎是这些标签(发布)的一部分:parent-2.4.0-RC1 parent-2.4.0 parent-2.3.0 parent-2.2.0


Jes*_*son 4

虽然没有专门用于此目的的 API,但应该有一个。请打开OkHttp 问题来报告此问题。

我们可能需要一段时间才能实现,因为我们需要找出最好的 API 是什么。使单个 URL 失效非常简单。使一系列 URL 无效(例如square.com/cash/*)更加困难,因为 OkHttp 的缓存当前是通过 URL 校验和组织的。还有一些丑陋的边缘情况,例如如果当前将无效的 URL 写入缓存会发生什么情况。