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

2019-07-13  本文已影响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卡权限。

上一篇下一篇

猜你喜欢

热点阅读