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());
}
});
总结
-
对于不支持缓存的接口,需要通过拦截器为其动态添加缓存响应头(
Cache-Control
),以使该接口支持缓存;对于支持缓存的接口,则无需使用拦截器修改响应头。 -
添加拦截器时,必须使用
cliend.addNetworkInterceptor(interceptor)
方法,使用cliend.addInterceptor(interceptor)
方法无效。 -
context.getCacheDir()
为应用内目录,不需要读写SD卡权限。