带 TTL 的 OkHttp

OkHttp with TTL

我使用 OkHttp 在应用程序启动时从后端获取一些数据。该请求只执行一次。响应字符串被解析为数据 class,存储在内存中并在应用程序生命周期内使用。现在后端要求我用 TTL 缓存一些数据。

if some_key in cache: return cache.get(some_key)
else:
    get value, ttl from BE.
    populate cache with ttl
    return value

最快的实现方式是什么?

在创建您的 OkHttpClient 实例时,只需将 .cache 方法应用于构建器,如下所示:

val okHttpClient = OkHttpClient.Builder()
    .cache(Cache(context.getCacheDir(), cacheSize)
    .build()

编辑:

要在正文过期后重复请求,您必须首先从请求中获取 max-age 值:

val cacheControl = CacheControl.parse(data.headers())
val maxAge = cacheControl.maxAgeSeconds()

然后使用 JobScheduler 或 AlarmManager 之类的东西安排下一个请求,或者如果您确定当前线程不会在下一个请求之前被杀死,您可以 post 延迟运行:

Handler().postDelayed({
    // make request
}, cacheControl.maxAgeSeconds().toLong().times(1000))