OkHttp拦截器实现无网络时加载缓存,避免Unknown host异常

我们在创建OkHttp客户端时,可以添加接口数据缓存,真的很香:

File cacheDir = ... // 缓存目录,可以是内部存储也可以是外部存储的目录
OkHttpClient okHttpClient = new OkHttpClient.Builder()
        .connectTimeout(10, TimeUnit.SECONDS)
        .cache(new Cache(cacheDir, 20 * 1024 * 1024)) // 这里给了20MB缓存目录容量,超过后会自动清理
        ....
        .build();

然后我们会发现,先正常请求网络数据,然后断开网络连接,重新请求,并没有返回缓存。
而是出现一些诸如“Unknown host…”解析不了域名这种异常,查看之前设置的缓存文件目录,也确实有文件,可怎么就不加载呢?
在这里插入图片描述
哦,结果还要配置一下缓存策略,回到我们的主题:拦截器。
我们可以在拦截器中实现网络连接判断并强制开起缓存:

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());
    }
}
... // 然后记得给Client添加拦截器
OkHttpClient okHttpClient = new OkHttpClient.Builder()
        ....
        .addInterceptor(new CacheInterceptor())
        .build();

如此一来,断开网络后,就会正确地加载缓存数据了。

发布了91 篇原创文章 · 获赞 204 · 访问量 54万+
展开阅读全文

okhttp缓存保存不了也读取不了

07-15

看了一下OKHTTP的使用,想试一下网络缓存功能,但GET请求后缓存文件一直不存在,只有一个journal.文件,找了半天也没找到问题,求大神指教。 ``` public class OkHttpUtil { private static OkHttpClient mOkHttpClient; //短缓存有效期为1秒钟 public static final int CACHE_STALE_SHORT = 1; //长缓存有效期为7天 public static final int CACHE_STALE_LONG = 60 * 60 * 24 * 7; private static Interceptor interceptor = new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); O2oLog.E("request=" + request); if (!NetUtil .isNetConnect(O2oApplication.context)) { request = request .newBuilder() .cacheControl( CacheControl.FORCE_CACHE) .build(); O2oLog.E("no network"); } Response response = chain .proceed(request); O2oLog.E("response=" + response); O2oLog.E("cacheResponse=" + response.cacheResponse()); O2oLog.E("networkResponse=" + response.networkResponse()); if (NetUtil .isNetConnect(O2oApplication.context)) { //有网的时候读接口上的@Headers里的配置,你可以在这里进行统一的设置 return response.newBuilder() .header("Cache-Control", "public, max-age=" + CACHE_STALE_SHORT) .removeHeader("Pragma") .build(); } else { return response.newBuilder() .header("Cache-Control", "public, only-if-cached, max-stale=" + CACHE_STALE_LONG) .removeHeader("Pragma") .build(); } } }; static { //设置缓存路径 File httpCacheDirectory = new File(StorageUtil.getCacheDirectory(Application.context, false), "APICache"); //设置缓存 100M Cache cache = new Cache(httpCacheDirectory, 100 * 1024 * 1024); mOkHttpClient = new OkHttpClient.Builder().connectTimeout(10, TimeUnit.SECONDS) .cache(cache) .addInterceptor(interceptor) // .addNetworkInterceptor(interceptor) .build(); } /** * 该不会开启异步线程。 * * @param request * @return * @throws IOException */ public static Response execute(Request request) throws IOException { return mOkHttpClient.newCall(request).execute(); } ... } ``` 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览