美文网首页
OkHttp启用接口缓存(Get请求)

OkHttp启用接口缓存(Get请求)

作者: 好学人 | 来源:发表于2019-07-13 18:32 被阅读0次

    第1步:导入依赖

    implementation("com.squareup.okhttp3:okhttp:3.12.3")
    

    第2步:添加权限

    <uses-permission android:name="android.permission.INTERNET" />
    

    第3步:在拦截器中修改响应头

    // 创建缓存拦截器对象
    Interceptor interceptor = new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {
            // 网络请求对象
            Request request = chain.request();
            // 继续请求服务器
            Response response = chain.proceed(request);
            // 改造Response
            return response.newBuilder()
                    .removeHeader("Pragma") // 移除原缓存请求头
                    .header("Cache-Control", "max-age=3600") // 添加缓存控制策略
                    .build(); // 构建Response
        }
    };
    

    第4步:启用OkHtpp接口缓存

    // 保存缓存文件的路径
    File cacheDir = context.getCacheDir();
    // 创建OkHttp缓存对象
    Cache cache = new Cache(cacheDir, 1024 * 1024);
    // 创建OkHttp对象
    OkHttpClient client = new OkHttpClient.Builder()
            .addNetworkInterceptor(interceptor) // 注:必须是addNetworkInterceptor()才有效
            .cache(cache) // 启用OkHttp接口缓存
            .build();
    // 创建请求对象
    Request request = new Request.Builder()
            .url("https://gitee.com/Haoxueren/server/raw/master/columns/person.json")
            .get()
            .build();
    

    第5步:异步请求服务器

    // 异步请求服务器
    Call call = client.newCall(request);
    call.enqueue(new Callback() {
        @Override
        public void onResponse(Call call, Response response) throws IOException {
            System.out.println(response.cacheControl());
            System.out.println(response.body().string());
        }
    
        @Override
        public void onFailure(Call call, IOException e) {
            System.out.println(e.getMessage());
        }
    });
    

    总结

    1. 对于不支持缓存的接口,需要通过拦截器为其动态添加缓存响应头(Cache-Control),以使该接口支持缓存;对于支持缓存的接口,则无需使用拦截器修改响应头。

    2. 添加拦截器时,必须使用cliend.addNetworkInterceptor(interceptor)方法,使用cliend.addInterceptor(interceptor)方法无效。

    3. context.getCacheDir()为应用内目录,不需要读写SD卡权限。

    相关文章

      网友评论

          本文标题:OkHttp启用接口缓存(Get请求)

          本文链接:https://www.haomeiwen.com/subject/vjvmkctx.html