Retrofit2.0+Okhttp不依赖服务端的数据缓存
随着Retrofit在项目中的使用,替换的以前使用的网络框架,相关的缓存机制也要进行替换,网络上大部分的Retrofit+okhttp缓存资料都是进行针对所有url的而且需要服务端的配合。有些时候是先有服务然后app去调用这些服务,所以这个时候没有服务端的配合我们在前端实现缓存比较空难但并不是很可以。(举个列子,有一个原来的服务更本不支持cache,但是我们在app中需要缓存这个服务的数据,这应该是前一段时间替换网络库时最后遇到的问题)。 为什么要做缓存处理?客观回答:
自己回答:
Retrofit+OkHttp的缓存机制:
缓存使用情况:
说到缓存,不是很了解的Http缓存的同学亦可以看一下浏览器 HTTP 协议缓存机制详解 这篇文章讲的很详细。 Cache控制:该部分对理解怎么缓存很重要~! 1、用在request中的cache控制头
2、用在response中控制cache的头
HTTP-请求、响应、缓存 代码实现:看到这里应该对缓存有一定的了解了,那么现在来看看怎么利用Retrofit2.0+Okhttp缓存的实现。 创建缓存文件,并对okhttp进行设置 public class RetrofitApiFactory{
private static OkHttpClient okHttpClient = null ;
private static File cacheFile = new File(ImageUtils.getAppCacheDir(),"xxxCache");
private static Cache cache = new Cache(cacheFile,1024 * 1024 * 50);
/******中间代码省略*****/
public static void initOkHttpClient(){
okHttpClient =
new OkHttpClient.Builder()
.cache(cache)
.readTimeout(TIME_OUT,TimeUnit.SECONDS)
.writeTimeout(TIME_OUT,TimeUnit.SECONDS)
.addInterceptor(new JobInterceptor("Interceptor"))
//only 有网情况下,一分钟内每次请求都会重新请求,不会走缓存
.addNetworkInterceptor(new JobInterceptor("NetworkInterceptor"))
//only 如果超过1分钟,离线请求不成功
.build();
clearCacheMap() ;
}
}
控制Cache中最最最主要的部分: public class JobInterceptor implements Interceptor {
/******中间代码省略*****/
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request() ;
if (!TextUtils.isEmpty(getCookie())) {
if (!NetworkDetection.getIsConnected()) {
try {
request = request
.newBuilder()
.addHeader("Cookie",getCookie())
.cacheControl(CacheControl.FORCE_CACHE)
.build();
} catch (Exception e) {
e.printStackTrace();
}
} else {
try {
request = request
.newBuilder()
.addHeader("Cookie",getCookie())
.build();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Response response = null;
try {
response = chain.proceed(request);
if(!response.isSuccessful()){
RetrofitApiFactory.initOkHttpClient();
} else {//如果请求体有缓存数据的需要那么对响应体进行缓存
int maxAge = request.cacheControl().maxAgeSeconds();
if (request.cacheControl().isPublic() && maxAge > 1) {
response = response.newBuilder()
.removeHeader("Pragma")//清楚响应体对Cache有影响的信息
.removeHeader("Cache-Control")//清楚响应体对Cache有影响的信息
.header("Cache-Control","public,max-age=" + maxAge)
.build();
}
}
} catch (IOException e) {
RetrofitApiFactory.initOkHttpClient();
throw new IOException(e) ;
}
return response;
}
}
接口使用: @Headers("Cache-Control: public,max-age=86400")
@GET
Call<ResponseBody> getCacheData(@Url String url);
解析:上面的绝大部分内容大家都在类似的文章上看到的。这里主要讲一下几点:
如有问题,欢迎沟通指正~!~! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |