首页 > 学院 > 开发设计 > 正文

OkHttp基本使用(四)缓存

2019-11-06 09:44:46
字体:
来源:转载
供稿:网友
此篇介绍OkHttp的缓存功能,实现无网络情况下从缓存读取数据,类似很多新闻类的APP,在没有网络的情况下也是可以进入首页。除了新闻类,可能还有阅读类的app也需要缓存功能,等等。总之缓存在实际项目开发中使用得比较平凡,而如果要我们自己去写一套缓存逻辑,显然是很麻烦的。接下来,介绍OkHttp的缓存功能的使用。配置缓存大小和缓存目录//获得缓存目录        File cacheFile = getCacheDir();        okHttpClient = new OkHttpClient                .Builder()                .cache(new Cache(cacheFile,4*1024*1024)) //设置缓存目录和缓存大小                .build();复制代码注意:缓存目录最好是私有缓存。一个APP、一个OkHttpClient对象、一个缓存目录。再次强调对于项目中的OkHttpClient需要是单例的--官方推荐。强制请求网络(经过测试,此种方式还是会写入缓存,只是没有读取缓存内容)<div>Request request = new Request.Builder()        .cacheControl(new CacheControl.Builder().noCache().build())//设置不读取缓存,直接进行网络请求        .url("http://publicobject.com/helloworld.txt")</div><div>        .build();</div>复制代码强制读取缓存。也就是不管缓存是否有数据,都不请求网络。Request request = new Request.Builder()          .cacheControl(new CacheControl.Builder()              .onlyIfCached()              .build())          .url("http://publicobject.com/helloworld.txt")          .build();      Response forceCacheResponse = client.newCall(request).execute();      if (forceCacheResponse.code() != 504) {        // The resource was cached! Show it.      } else {        // The resource was not cached.      }复制代码强制读取缓存的第2中写法(其实内部代码和上面的写法一致):Request request = builder.url(Config.URL).cacheControl(CacheControl.FORCE_CACHE).build();                    Response response1 = okHttpClient.newCall(request).execute();                    String result1 = null;                    if (response1.code() != 504) {                        result1 = response1.body().string();                    } else {                        System.out.PRintln("-androidxx--null");                    }复制代码强制读取缓存的测试过程:先成功请求一次,然后将网络断开,使用强制取缓存的方式,可以将缓存的结果请求到。没有网络自动取缓存(默认方式)Request request = builder.url("https://publicobject.com/helloworld.txt").build();                    Response response1 = okHttpClient.newCall(request).execute();复制代码OkHttp设置了缓存大小和目录之后,默认的网络请求方式是如果没有网络或者网络连接失败,会返回缓存中的信息。OkHttp获取缓存信息的源码:(这是OkHttp中Cache类的源码中的一部分)Response get(Request request) {    String key = urlToKey(request);    DiskLruCache.Snapshot snapshot;    Entry entry;    try {      snapshot = cache.get(key);      if (snapshot == null) {        return null;      }    } catch (IOException e) {      // Give up because the cache cannot be read.      return null;    }复制代码通过以上源码,可以看到有一个大家比较熟悉的类DiskLruCache,这就是一个磁盘缓存的工具类,OkHttp中使用的就是DiskLruCache进行的缓存。      如果想直接取缓存信息,可以将源码中的Cache类的get方法的限定修饰符改成public,然后可以通过如下方式直接读取缓存内容:Response response = okHttpClient.cache().get(request);//get方法默认是看不到的,需要修改源码复制代码总结1、使用缓存功能,一定要先配置缓存目录和大小。2、在一般情况下,不需要做额外的配置,OkHttp在没有网络的情况下,会自动请求缓存信息。但于此同时,网络请求失败会出现异常(已经捕获),通过异常可以做一些逻辑相关的处理。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表