Android中okhttp⾃定义Interceptor(缓存)
Android 中okhttp⾃定义Interceptor(缓存)
前⾔:
新公司项⽬是没有缓存的,我的天,坑⽤户流量不是么。不知道有⼈就喜欢⼀个界⾯没事点来点去的么。怎么办?⼀个
字“加”。
由于项⽬的⽹络请求被我换成了retrofit。⽽retrofit的⽹络请求默认基于okhttp
android retrofit
okhttp的缓存由返回的header 来决定。如果服务器⽀持缓存的话返回的headers⾥⾯会有这⼀句
”Cache-Control”,“max-age=time”
这⾥的time是⼀个单位为秒的时间长度。意思是缓存的时效,⽐如要设置这个API的缓存时效为⼀天
返回的header就应该是
”Cache-Control”,“max-age=3600*24”
不巧。公司的服务器不⽀持缓存的,怎么看出来的?因为我们的返回的headers是包含这些的
但我们⼜想⽤缓存,这个时候怎么办呢。,得益于okhttp的Interceptor机制,⼀切的配置都可以变得那么简单优雅。
我们可以在⾥截获headers然后移除默认的Cache-Control
但是我们知道有些API返回的数据适合缓存,⽽有些是不适合的,⽐如资讯列表,各种更新频率⽐较⾼的,是不可以缓存的,⽽像资讯详情这种数据是可以缓存的。所以我们不能直接统⼀写死。需要动态配置。
同样的,我们也在header⾥⾯作⽂章,⾃定义⼀个header。注意这个header⼀定不能被其他地⽅使⽤,不然会被覆盖值。这⾥我们定义的header的key名字为:Cache-Time。我们在⾥去取这个header。如果取得了不为空的值,说明这个请求是要⽀持缓存的,缓存的时间就是Cache-Time对应的值。我们把他添加进去。
⾃定义缓存Interceptor
public class CacheInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = quest();
Response response = chain.proceed(request);
String cache = request.header("Cache-Time");
if (!Util.checkNULL(cache)) {//缓存时间不为空
Response response1 = wBuilder()
.removeHeader("Pragma")
.removeHeader("Cache-Control")
//cache for cache seconds
.header("Cache-Control", "max-age="+cache)
.build();
return response1;
} else {
return response;
}
}
}
缓存定义好了,我们还需要配置缓存的路径。这⾥我们定义⼀个缓存的内容提供器
public class CacheProvide {
Context mContext;
public CacheProvide(Context context) {
mContext = context;
}
public Cache provideCache() {//使⽤应⽤缓存⽂件路径,缓存⼤⼩为10MB
return new CacheDir(), 10240 * 1024);
}
}
通过上⾯的代码我们可以看到我们指定了缓存的⼤⼩为10MB。这⾥如果缓存的数据量⼤于这个值,内部会使⽤lur规则进⾏删除。
下⾯我们开始配置OkHttpClient
OkHttpClient client = new OkHttpClient.Builder()
.addNetworkInterceptor(new CacheInterceptor())//缓存
.cache(new CacheProvide(mAppliactionContext).provideCache())//缓存空间提供器
.connectTimeout(8, TimeUnit.SECONDS)
.readTimeout(5, TimeUnit.SECONDS)
.writeTimeout(5, TimeUnit.SECONDS)
.build();
好了,现在我们如果哪⾥需要缓存数据的话,只要在请求⾥添加header(“Cache-Time”,“3600*24”)就可以把当前数据缓存⼀天啦
感谢阅读,希望能帮助到⼤家,谢谢⼤家对本站的⽀持!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。