带 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))
我使用 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))