retrofit2.0缓存设置
如果你设置retrofit缓存出现了
okhttp或者retrofit实现网络缓存504错误原因错误请使用以下方法设置缓存
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; // 离线时缓存保存4周,单位:秒
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; // 在线缓存在1分钟内可读取 单位:秒
return originalResponse.newBuilder()
.removeHeader("Pragma")// 清除头信息,因为服务器如果不支持,会返回一些干扰信息,不清除下面无法生效
.removeHeader("Cache-Control")
.header("Cache-Control", "public, max-age=" + maxAge)
.build();
}
};
//设置缓存路径 内置存储
//File httpCacheDirectory = new File(context.getCacheDir(), "responses");
//外部存储
File httpCacheDirectory = new File(context.getExternalCacheDir(), "responses");
//设置缓存 10M
int cacheSize = 10 * 1024 * 1024;
Cache cache = new Cache(httpCacheDirectory, cacheSize);
OkHttpClient client = new OkHttpClient.Builder()
.cache(cache)
.addInterceptor(logging)
.addInterceptor(baseInterceptor)
.addNetworkInterceptor(rewriteCacheControlInterceptor)
.connectTimeout(15, TimeUnit.SECONDS)
.build();
return new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create()
.baseUrl(BASEURL)
.client(client)
.build()
.create(MovieApiService.class);
}
}
需要借助CacheControl 类才可以正常使用
浙公网安备 33010602011771号