我们在创建OkHttp客户端时,可以添加接口数据缓存,真的很香:
1 2 3 4 5 6
| File cacheDir = ... OkHttpClient okHttpClient = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .cache(new Cache(cacheDir, 20 * 1024 * 1024)) .... .build();
|
然后我们会发现,先正常请求网络数据,然后断开网络连接,重新请求,并没有返回缓存。
而是出现一些诸如“Unknown host…”解析不了域名这种异常,查看之前设置的缓存文件目录,也确实有文件,可怎么就不加载呢?
哦,结果还要配置一下缓存策略,回到我们的主题:拦截器。
我们可以在拦截器中实现网络连接判断并强制开起缓存:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| private static class CacheInterceptor implements Interceptor { @Override public okhttp3.Response intercept(Chain chain) throws IOException { Request request = chain.request(); Request.Builder requestBuilder = request.newBuilder(); if () { requestBuilder.cacheControl(CacheControl.FORCE_CACHE); } return chain.proceed(requestBuilder.build()); } } ... OkHttpClient okHttpClient = new OkHttpClient.Builder() .... .addInterceptor(new CacheInterceptor()) .build();
|
如此一来,断开网络后,就会正确地加载缓存数据了。