前言
–
在 Android 开发过程中,Retrofit 的出现绝对是里程碑式的,说起 Retrofit 不得不说 square,这绝对是家l好公司,业界良心。
回到今天的主题,OKHttp3 网络层 缓存实现与分析。有人可能会说,你这怎么又扯到 OKHttp3 了,好了废话不扯。
完整项目 托管在 github 上,直达电梯:豆瓣电影客户端 github
代码分析
本文主要还是关于实现层面的讲解,只是豆瓣电影客户端其中一个功能。先贴代码(经过测试的代码)。
class Factory {
private static String TAG = "factory";
public static MovieApiService createService(final Context context) {
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
/**
* 获取缓存
*/
Interceptor baseInterceptor = new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
if (!AppUtil.isNetWorkAvailable(context)) {
/**
* 离线缓存控制 总的缓存时间=在线缓存时间+设置离线缓存时间
*/
int maxStale = 60 * 60 * 24 * 28;
CacheControl tempCacheControl = new CacheControl.Builder()
.onlyIfCached()
.maxStale(maxStale, TimeUnit.SECONDS)
.build();
request = request.newBuilder()
.cacheControl(tempCacheControl)
.build();
Log.i(TAG, "intercept:no network ");
}
return chain.proceed(request);
}
};
Interceptor rewriteCacheControlInterceptor = new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Response originalResponse = chain.proceed(request);
int maxAge = 1 * 60;
return originalResponse.newBuilder()
.removeHeader("Pragma")
.removeHeader("Cache-Control"