【问题标题】:Caching response from Retrofit来自 Retrofit 的缓存响应
【发布时间】:2017-12-29 17:12:46
【问题描述】:
我确实提前道歉,因为我知道问题已经存在,但我想找到一个更简单的方法或指南来彻底解释它。
我正在使用 Retrofit 从 Reddit 的 Json 网站获取响应。我想缓存要在离线模式下使用的应用程序的响应。如果响应或 Json 中有新项目,我也想更新响应。
请您指导我正确的方向,因为我以前从未使用过缓存。
【问题讨论】:
标签:
android
json
caching
retrofit
【解决方案1】:
对于缓存响应,请在 Retrofit builder 中使用 OkHttpClient。
int cacheSize = 10 * 1024 * 1024; // 10 MB
Cache cache = new Cache(getCacheDir(), cacheSize);
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.cache(cache)
.build();
Retrofit.Builder builder = new Retrofit.Builder()
.baseUrl("http://10.0.2.2:3000/")
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create());
Retrofit retrofit = builder.build();
上面的 Retrofit 实例将缓存所有响应,直到达到 10 MB 的最大值。超过缓存磁盘限制后,它会清理最旧的条目。
更多详情:Retrofit response caching
【解决方案2】:
至少对我来说,最好的方法是制作一个模型 pojo 类,并将给出的响应放入该类的对象中。关于缓存,我使用的是hawk,这是一个简单的键值存储,经证明易于使用并且运行良好,因为它将数据放入应用程序存储并保留在那里,即使您卸载并重新安装应用程序也是如此.
关于更新部分,你必须得到响应才能查看它是否相同,所以为什么不简单地覆盖旧的,这样你总是有最新的。
就此而言,我正在使用evernote job,它与 RxJava(如果您正在使用)配合得很好,它与 POST 方法配合得很好,并且具有像 .setPeriodic(TimeUnit.DAYS.toMillis(1)) 这样的属性,您可以在其中放置工作应该的时间运行(这有利于每 x 分钟缓存一次),还有.setUpdateCurrent(true),如果需要,它将更新当前响应。
只需尝试查看这两个库的文档,也许您会发现它们很有帮助。