Retrofit2缓存实现

为什么使用缓存

1.提高加载速度
2.减少流量消耗
3.减轻服务端压力
4.没有网络时可以同样访问,优化用户体验

说说我的需求:
1.有网的时候使用缓存较短时间,及时更新,没有网的时候缓存更长时间
2.指定的接口产生缓存文件,其他接口不会产生缓存文件
3.可通过下拉刷新强制刷新

实现原理

Retrofit2实现缓存自然是通过okhttp拦截器实现,具体则是由Cache-Control控制
分别如下:

123456789101112
no-cache    no-cache是会被缓存的,只不过每次在向客户端(浏览器)提供响应数据时,缓存都要向服务器评估缓存响应的有效性。 no-store    所有内容都不会被缓存到缓存或 Internet 临时文件中max-age=xxx (xxx is numeric)    缓存的内容将在 xxx 秒后失效, 这个选项只在HTTP 1.1可用, 并如果和Last-Modified一起使用时, 优先级较高max-stale和max-age一样,只能设置在请求头里面。同时设置max-stale和max-age,缓存失效的时间按最长的算。(这个其实不用纠结)CacheControl.FORCE_CACHE 强制使用缓存,如果没有缓存数据,则抛出504(only-if-cached)CacheControl.FORCE_NETWORK 强制使用网络,不使用任何缓存.

简单实现

1.先要创建拦截器

1234567891011121314151617
static Interceptor REWRITE_CACHE_CONTROL_INTERCEPTOR = new Interceptor() {                public Response (Chain chain) throws IOException {            Request request = chain.request();            Response response = chain.proceed(request);            if (NetworkUtil.isNetworkAvalible(MyApplication.getContext())) {                int maxAge = 60;                return response.newBuilder()                        .removeHeader("Pragma")//清除头信息,因为服务器如果不支持,会返回一些干扰信息,不清除下面无法生效                        .header("Cache-Control", "public ,max-age=" + maxAge)                        .build();            }            return response;        }    };

2.这样的话就写好了拦截器,然后就是把拦截器设置到okhttp里面

1234567891011121314151617
File httpCacheDirectory = new File(MyApplication.getInstance().getExternalCacheDir(), "HttpCache");大专栏
上一篇:SpringDataJPA中NO Session错误


下一篇:使用Java代码安装Netweaver ABAP的Certificate