Retrofit + OkHttp缓存处理的示例代码
程序员文章站
2023-12-17 11:11:46
通过缓存处理可以有效降低服务器的负荷,加快app界面加载速度,提升用户体验。retrofit + okhttp缓存处理流程是这样的,请求响应之后会在data/data/pa...
通过缓存处理可以有效降低服务器的负荷,加快app界面加载速度,提升用户体验。retrofit + okhttp缓存处理流程是这样的,请求响应之后会在data/data/packagename/cache下建立一个response文件夹,保存缓存数据,后续请求时若无网络,则直接读取缓存内容,若有网络则从网络获取最新数据并缓存。
1.设置缓存路径,大小及添加缓存拦截器
//设置缓存路径 file httpcachedirectory = new file(commonapplication.getinstance().getcachedir(), "responses"); //设置缓存 10m cache cache = new cache(httpcachedirectory, 10 * 1024 * 1024); //创建okhttpclient,并添加拦截器和缓存代码 okhttpclient client = new okhttpclient.builder() .addnetworkinterceptor(new cacheinterceptor(commonapplication.getinstance())) .cache(cache).build();
2.定义缓存拦截器。若网络正常,则缓存有效期1分钟;若网络异常,则缓存有效期6小时
public class cacheinterceptor implements interceptor { private context mcontext; public cacheinterceptor(context context) { mcontext = context; } @override public response intercept(chain chain) throws ioexception { request request = chain.request(); if (networkutils.isnetworkavailable(mcontext)) {//没网强制从缓存读取(必须得写,不然断网状态下,退出应用,或者等待一分钟后,就获取不到缓存) request = request.newbuilder() .cachecontrol(cachecontrol.force_cache) .build(); } response response = chain.proceed(request); response responselatest; if (networkutils.isnetworkavailable(mcontext)) { int maxage = 60; //有网失效一分钟 responselatest = response.newbuilder() .removeheader("pragma") .removeheader("cache-control") .header("cache-control", "public, max-age=" + maxage) .build(); } else { int maxstale = 60 * 60 * 6; // 没网失效6小时 responselatest = response.newbuilder() .removeheader("pragma") .removeheader("cache-control") .header("cache-control", "public, only-if-cached, max-stale=" + maxstale) .build(); } return responselatest; } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
-
Retrofit + OkHttp缓存处理的示例代码
-
Android Picasso使用高斯模糊处理的示例代码
-
OKHttp3(支持Retrofit)的网络数据缓存Interceptor拦截器的实现
-
Android Picasso使用高斯模糊处理的示例代码
-
Django使用redis缓存服务器的实现代码示例
-
PHP利用缓存处理用户注册时的邮箱验证,成功后用户数据存入数据库操作示例
-
ajax异步处理POST表单中的数据示例代码
-
XMLHttpRequest处理xml格式的返回数据(示例代码)
-
HTML5 manifest离线缓存的示例代码
-
RxJava和Retrofit2的统一处理单个请求示例详解