在 MyCacheinterceptor 中主要做了(post方式无法缓存)
①设置缓存位置
②无网时:设置缓存协议
③有网:加载网络数据;无网:加载缓存数据
代码:
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.addInterceptor(myCacheinterceptor)//应用拦截器
.addNetworkInterceptor(myCacheinterceptor)//网络拦截器
.connectTimeout(5, TimeUnit.SECONDS)
.cache(new Cache(new File(getCacheDir(), "Cache"), 1024 * 1024 * 10))
.build();
class MyCacheinterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
//1.获取请求数据
Request request = chain.request();
//2.判断如果无网时,设置缓存协议
if (!isNetworkAvailable(MainActivity.this)) {
request = request.newBuilder().cacheControl(CacheControl.FORCE_CACHE).build();
}
//3.开始请求网络,获取响应数据
Response originalResponse = chain.proceed(request);
//4.判断是否有网
if (isNetworkAvailable(MainActivity.this)) {、
//有网,获取网络数据
int maxAge = 0;
return originalResponse.newBuilder()
.removeHeader("Pragma")
.header("Cache-Control", "public ,max-age=" + maxAge)
.build();
} else {
//没有网络,获取缓存数据
int maxStale = 15*60;
return originalResponse.newBuilder()
.removeHeader("Pragma")
.header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale)
.build();
}
}
}
/**
检测是否有网
*/
public static boolean isNetworkAvailable(Context context) {
if (context != null) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getActiveNetworkInfo();
if (info != null) {
return info.isAvailable();
}
}
return false;
}