- 离线时使用cache,在线时访问网络并更新cache
- OkHttpClient设置cache后,response自动进行缓存;通过拦截器,离线时request添加头信息header(“Cache-Control”, “only-if-cached”)强制使用缓存
- 这些方法不支持cache:public static boolean invalidatesCache(String method) {
return method.equals(“POST”) || method.equals(“PATCH”) || method.equals(“PUT”) || method.equals(“DELETE”) || method.equals(“MOVE”);
} - 如果不想使用okhttp的cache机制,也可以自己通过对象序列化等方式自己保存reponse结果
File httpCacheDir = new File(getActivity().getExternalCacheDir(), "response");
Cache cache = new Cache(httpCacheDir, 10 * 1024 * 1024);
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
if(!isNetWorkAvailable()){
request = request.newBuilder()
.cacheControl(CacheControl.FORCE_CACHE)
.build();
}
return chain.proceed(request);
/*Response response = chain.proceed(request);
if(isNetWorkAvailable()){
return response.newBuilder()
.header("Cache-Control", "public, max-age=" + 0)
.removeHeader("Pragma")
.build();
}else {
return response.newBuilder()
.header("Cache-Control", "public, only-if-cached, max-stale=" + Integer.MAX_VALUE)
.removeHeader("Pragma")
.build();
}*/