OkHttp基本使用(四)缓存

此篇介绍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在没有网络的情况下,会自动请求缓存信息。但于此同时,网络请求失败会出现异常(已经捕获),通过异常可以做一些逻辑相关的处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨景文Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值