okhttp3缓存实践

来源:互联网 发布:赣州教育软件代理 编辑:程序博客网 时间:2024/05/01 06:00
  • 离线时使用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);                        //无效,需结合addNetworkInterceptor使用                        /*Response response = chain.proceed(request);                        if(isNetWorkAvailable()){                            return response.newBuilder()                                    .header("Cache-Control", "public, max-age=" + 0) //有网络时设置缓存超时时间0个小时                                    .removeHeader("Pragma") //清除头信息,因为服务器如果不支持,会返回一些干扰信息,不清除下面无法生效                                    .build();                        }else {                            return response.newBuilder()                                    .header("Cache-Control", "public, only-if-cached, max-stale=" +  Integer.MAX_VALUE)                                    .removeHeader("Pragma")                                    .build();                        }*/
0 0
原创粉丝点击