欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Retrofit + OkHttp缓存处理的示例代码

程序员文章站 2023-12-17 11:11:46
通过缓存处理可以有效降低服务器的负荷,加快app界面加载速度,提升用户体验。retrofit + okhttp缓存处理流程是这样的,请求响应之后会在data/data/pa...

通过缓存处理可以有效降低服务器的负荷,加快app界面加载速度,提升用户体验。retrofit + okhttp缓存处理流程是这样的,请求响应之后会在data/data/packagename/cache下建立一个response文件夹,保存缓存数据,后续请求时若无网络,则直接读取缓存内容,若有网络则从网络获取最新数据并缓存。

1.设置缓存路径,大小及添加缓存拦截器

//设置缓存路径
file httpcachedirectory = new file(commonapplication.getinstance().getcachedir(), "responses");
//设置缓存 10m
cache cache = new cache(httpcachedirectory, 10 * 1024 * 1024);
//创建okhttpclient,并添加拦截器和缓存代码
okhttpclient client = new okhttpclient.builder()
    .addnetworkinterceptor(new cacheinterceptor(commonapplication.getinstance()))
    .cache(cache).build();

2.定义缓存拦截器。若网络正常,则缓存有效期1分钟;若网络异常,则缓存有效期6小时

public class cacheinterceptor implements interceptor {
  private context mcontext;
  public cacheinterceptor(context context) {
    mcontext = context;
  }
  @override
  public response intercept(chain chain) throws ioexception {
    request request = chain.request();
    if (networkutils.isnetworkavailable(mcontext)) {//没网强制从缓存读取(必须得写,不然断网状态下,退出应用,或者等待一分钟后,就获取不到缓存)
      request = request.newbuilder()
          .cachecontrol(cachecontrol.force_cache)
          .build();
    }
    response response = chain.proceed(request);
    response responselatest;
    if (networkutils.isnetworkavailable(mcontext)) {
      int maxage = 60; //有网失效一分钟
      responselatest = response.newbuilder()
          .removeheader("pragma")
          .removeheader("cache-control")
          .header("cache-control", "public, max-age=" + maxage)
          .build();
    } else {
      int maxstale = 60 * 60 * 6; // 没网失效6小时
      responselatest = response.newbuilder()
          .removeheader("pragma")
          .removeheader("cache-control")
          .header("cache-control", "public, only-if-cached, max-stale=" + maxstale)
          .build();
    }
    return responselatest;
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

上一篇:

下一篇: