OKhttp项目缓存使用思路

这一章我们从应用层面来讲述一下okhttp在一个商城项目中的使用策略。这是我20120-01-01时候的思路。以公司的项目来讲。

首先先科普一下请求头缓存知识:

  • noCache(),不使用缓存,使用网络请求
  • noStore(),不使用缓存也不存储缓存数据
  • maxAge(),缓存的有效时间,超过该时间会重新请求数据
  • maxStale(),超过缓存有效时间后,可继续使用旧缓存的时间,之后需要重新请求数据
  • minFresh(),增加额外的缓存的有效时间,之后需要重新请求数据
  • onlyIfCached(),使用缓存,不使用网络请求
  • noTransform(),不接受经过转码的响应
  • immutable(),缓存有效时间内,响应不会变化,避免服务器处理304响应

在商城项目中,我们的

  • 轮播图数据可以设置为一天一变。
  • 底部推荐卡片数据最好是半小时更新一次。
  • 首页导航栏数据可以一天更新一次。
  • 固定图标资源一个星期更新一次。
  • 地区资源一个月更新一次。
    以此类推,把更新频率高的资源设置的有限时间可以短,低的则长。
    那么我们使用哪个请求头比较好,
    可以配合使用max-age 和 only-if-cache 来实现。
    max-age设置有限时间则重新请求,
    only-if-cache则强制使用缓存资源。
    我们每次请求前检查网络是否正常,如有问题则强制更改请求头为强制使用缓存资源,来保证我们的界面不至于难看。

那么我们该怎么使用,

  • 配置缓存资源路径大小
  • 配置拦截器
 String url = "http://publicobject.com/helloworld.txt";
        // 缓存目录
        File file = new File(Environment.getExternalStorageDirectory(), "a_cache");

 .cache(new Cache(file, cacheSize)) // 配置缓存
public class NetCacheInterceptor implements Interceptor {
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        Response originResponse = chain.proceed(request);

        //设置响应的缓存时间为60秒,即设置Cache-Control头,并移除pragma消息头,因为pragma也是控制缓存的一个消息头属性
        originResponse = originResponse.newBuilder()
                .removeHeader("pragma")
                .header("Cache-Control", "max-age=10")
                .build();

        return originResponse;
    }
}

我们可以在拦截器中通过 request.url().toString() 来获取到请求地址,根据不同的请求地址来配置不同的过期时间,不过在配置之前我们应该先判断网络是否正常。

需要注意的是我们使用缓存需要在返回的时候关闭body()

 response.body().close();
 否则缓存无效
  • 配置缓存路径
  • 配置拦截器
    • 检查网络
      • 通 设置 max-age
      • 不痛 强制使用缓存 only-if-cache
发布了20 篇原创文章 · 获赞 3 · 访问量 431

猜你喜欢

转载自blog.csdn.net/weixin_41078100/article/details/104326870