请选择 进入手机版 | 继续访问电脑版
JAVEN

OkHttp的基本使用(四)缓存使用

所在版块: 课堂笔记 2016-04-26 15:29   [复制链接] 查看: 1814|回复: 0
本帖最后由 yangjw 于 2016-4-26 22:09 编辑

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



  • 总结
1、使用缓存功能,一定要先配置缓存目录和大小。
2、在一般情况下,不需要做额外的配置,OkHttp在没有网络的情况下,会自动请求缓存信息。但于此同时,网络请求失败会出现异常(已经捕获),通过异常可以做一些逻辑相关的处理。

下一篇【OkHttp的基本使用(五)拦截器



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

我的博客

QQ|Archiver|手机版|小黑屋|课堂笔记  

GMT+8, 2019-2-17 01:03 , Processed in 0.088719 second(s), 28 queries .

快速回复 返回列表