1. noCache 不使用缓存,全部走网络

2. noStore 不使用缓存,也不存储缓存

3. onlyIfCached 只使用缓存

4. maxAge 设置最大失效时间,失效则不使用 需要服务器配合

5. maxStale 设置最大失效时间,失效则不使用 需要服务器配合 感觉这两个类似 还没怎么弄清楚,清楚的同学欢迎留言

6. minFresh 设置有效时间,依旧如上

7. FORCE_NETWORK 只走网络

8. FORCE_CACHE 只走缓存

结合推酷和简书看

Cache-Control: no-cache  在请求头中的意思是:不去拿缓存的数据,直接去访问服务器的数据。  在响应头中的意思是:服务器允许客户端缓存,但是必须先验证一下(和 no-store的区别)

Cache-Control: max-age=300 在请求头中表示:第一次访问服务器获取数据之后,300秒之内再访问时,直接走缓存,超过300秒再去请求服务器

              在响应头中表示:300秒之内,从服务器的缓存中回给客户端,300秒后从真正的数据中回给客户端

在响应头中,Cache-Control参数的 no-cache,表示客户端仍然可以缓存,但是缓存时要评估下有效性(?)

相应的,在响应头中,no-store,表示客户端一定无法缓存,注意两者区别.

  用ReTrofit做缓存时,使用的OkHttp的拦截器,在ReTrofit初始化中进行设置

  1. //构造函数
    public WebControl_Retrofit(){
  2. init();
  3. }
  1. public void init() {
  2. Log.d("OkHttp","ReTrofit init");
  3. HttpLoggingInterceptor logging = new HttpLoggingInterceptor();//添加访问网络的日志
  4. logging.setLevel(HttpLoggingInterceptor.Level.BODY);//日志级别
  5. OkHttpClient httpClient = new OkHttpClient();
  6.  
  7. //缓存路径
  8. File cacheFile = new File(UIUtils.getContext().getCacheDir().getAbsolutePath(), "HttpCache");
  9. Cache cache = new Cache(cacheFile, 1024 * 1024 * 100);//缓存文件为100MB
  10. httpClient.setCache(cache);
  11.  
  12. Interceptor netInterceptor = new Interceptor() {
  13. @Override
  14. public Response intercept(Chain chain) throws IOException {
  15. Request request = chain.request();
  16. if(!UIUtils.isNetworkReachable(UIUtils.getContext())){//如果网络不可用
  17. request=request.newBuilder()
  18. .cacheControl(CacheControl.FORCE_CACHE)
  19. .build();
  20. Log.d("OkHttp","网络不可用请求拦截");
  21. }else{//网络可用
  22. request = request.newBuilder()
  23. .cacheControl(CacheControl.FORCE_NETWORK)
  24. .build();
  25. Log.d("OkHttp","网络可用请求拦截");
  26. }
  27. Response response = chain.proceed(request);
  28. if(UIUtils.isNetworkReachable(UIUtils.getContext())){//如果网络可用
  29. Log.d("OkHttp","网络可用响应拦截");
  30. response= response.newBuilder()
  31. //覆盖服务器响应头的Cache-Control,用我们自己的,因为服务器响应回来的可能不支持缓存
  32. .header("Cache-Control", "public,max-age=2")
  33. .removeHeader("Pragma")
  34. .build();
  35. }else{
  36. // Log.d("OkHttp","网络不可用响应拦截");
  37. // int maxStale = 60 * 60 * 24 * 28; // tolerate 4-weeks stale
  38. // response= response.newBuilder()
  39. // .header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale)
  40. // .removeHeader("Pragma")
  41. // .build();
  42. }
  43. return response;
  44.  
  45. }
  46. };
  47. httpClient.interceptors().add(netInterceptor);//添加本地缓存拦截器,用来拦截本地缓存
  48. httpClient.networkInterceptors().add(netInterceptor);//添加网络拦截器,用来拦截网络数据
  49. httpClient.interceptors().add(logging); // <-- this is the important line!
  50.  
  51. mRetro = new Retrofit.Builder()
  52. .baseUrl(Web_GlobalConstant.SERVER_URL)
  53. .addConverterFactory(GsonConverterFactory.create())
  54. .addCallAdapterFactory(retrofit.RxJavaCallAdapterFactory.create())
  55. .client(httpClient)
  56. .build();
  57. }

ReTrofit是根据请求服务器的URL去创建缓存文件,请求的URL不同,所创建的缓存文件也不同,在发起访问服务器请求时,Retrofit根据URL去找对应的缓存,然后返回缓存的数据

刷新和加载更多的思路:让服务器给每一条数据做一个时间戳标记,回过来数据时放在Json里,客户端的请求URL中加一个时间戳参数,下拉刷新时,客户端传时间戳为0,表示请求最新的20条数据(假设以20条为单位),请求后ReTrofit根据URL把最新20条数据缓存起来,以请求朋友圈为例子,那么朋友圈缓存文件里只有一个文件,那就是最新的20条数据,并且永远会这样,把传过来的最后一条数据的时间戳记下来,等到上拉加载时,把这个时间戳参数传过去,然后服务器再把这个时间戳对应数据的之后20条数据回过来,如此循环,这样就能保证数据完整性,上拉加载更多的数据不需要缓存,只缓存最新的20条数据,服务器是以时间倒序存储的数据

做个笔记:static修饰的变量,在应用程序没有完全被清理时,会一直保持引用

这里是我的GitHub地址,里面有我自己做的一些有用的Demo,适合新手学习,欢迎大家star我的项目 https://github.com/gnehsuy

使用ReTrofit做缓存(结合上拉加载和下拉刷新)的更多相关文章

  1. Vue-上拉加载与下拉刷新(mint-ui:loadmore)一个页面使用多个上拉加载后冲突问题

    所遇问题: 该页面为双选项卡联动,四个部分都需要上拉加载和下拉刷新功能,使用的mint-ui的loadmore插件,分别加上上拉加载后,只有最后一个的this.$refs.loadmore.onTop ...

  2. 使用mescroll实现上拉加载与下拉刷新

    现在上拉加载与下拉刷新几乎已经是移动端必备功能之一了,自己实现一个太麻烦,但是好用的插件又非常少.之前看到网上很多人都在用iScroll,于是也尝试用它做了几个DEMO,但或多或少都有一些问题,比如这 ...

  3. C#构造方法(函数) C#方法重载 C#字段和属性 MUI实现上拉加载和下拉刷新 SVN常用功能介绍(二) SVN常用功能介绍(一) ASP.NET常用内置对象之——Server sql server——子查询 C#接口 字符串的本质 AJAX原生JavaScript写法

    C#构造方法(函数)   一.概括 1.通常创建一个对象的方法如图: 通过  Student tom = new Student(); 创建tom对象,这种创建实例的形式被称为构造方法. 简述:用来初 ...

  4. 你必须了解的RecyclerView的五大开源项目-解决上拉加载、下拉刷新和添加Header、Footer等问题

    前段时间做项目由于采用的MD设计,所以必须要使用RecyclerView全面代替ListView.但是开发中遇到了需要实现RecyclerView上拉加载.下拉刷新和添加Header以及Footer等 ...

  5. vue使用vant-ui实现上拉加载、下拉刷新和返回顶部

    vue使用vant-ui实现上拉加载.下拉刷新和返回顶部 vue现在在移动端常用的ui库有vant-ui和mint-ui,上拉加载.下拉刷新和返回顶部也是移动端最基础最常见的功能.下面就用vant-u ...

  6. 全网最easy的better-scroll实现上拉加载和下拉刷新

    前言 移动端页面常见的一种效果:下拉刷新(pulldownrefresh)和上拉加载(pullupload),目的都是为了增强用户的体验效果,因此各种移动端滑动插件也是层出不穷,今天小编也在这里给大家 ...

  7. 【微信小程序】scroll-view 的上拉加载和下拉刷新

    1.在微信小程序中,想到 下拉刷新 和 上拉加载,如果是整个页面都拖动的话,可以在页面配置中,配置 enablePullDownRefresh 和 onReachBottomDistance 然后在 ...

  8. UITableView与UISearchController搜索及上拉加载,下拉刷新

    #import "ViewController.h" #import "TuanGouModel.h" #import "TuanGouTableVi ...

  9. vue.js移动端app实战4:上拉加载以及下拉刷新

    上拉加载以及下拉刷新都是移动端很常见的功能,在搜索或者一些分类列表页面常常会用到. 跟横向滚动一样,我们还是采用better-scroll这个库来实现.由于better已经更新了新的版本,之前是0.几 ...

  10. 移动端上拉加载,下拉刷新效果Demo

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

随机推荐

  1. 关于oracle数据库(1)

    兼容性的设置 cmd.exe是微软Windows系统的命令行程序,类似于微软的DOS操作系统.cmd.exe是一个16/32位的命令行程序,运行在Windows NT/2000/XP/2003/Vis ...

  2. docker network

    前言:前面的部分一直都是单机跑docker,但实际生产环境不可能只用一台来跑.肯定会用到多台,因为他们都是内部私有ip,那么多台主机之间的容器如何通信?这个是个很头疼的问题!目前主流几种方法如下: 1 ...

  3. mongoDB6--查询表达式

    接上一篇总结<深入查询表达式1>上一篇我们介绍了mongodb的一些表达式的深入应用.可能大家觉得有些指令比较难记,下面给大家介绍一些简洁的表达式.给大家介绍的是以下两个指令:分别是$wh ...

  4. tomcat各目录(文件)作用

    以tomcat7.0.50为例,主目录下有bin,conf,lib,logs,temp,webapps,work 7个文件夹 bin目录主要是用来存放tomcat的命令,主要有两大类,一类是以.sh结 ...

  5. c语言-猜数字游戏

    #include <stdio.h> #include <stdlib.h> int top(); int input(); void main() { ; int numbe ...

  6. MFC中获取系统当前时间

    1.使用CTime类 CString str; //获取系统时间 CTime tm; tm=CTime::GetCurrentTime(); str=tm.Format("现在时间是%Y年% ...

  7. selenium高级用法

    http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp# WebDriver: Advanced Usage Explicit and Im ...

  8. HDU2502:月之数

    Problem Description 当寒月还在读大一的时候,他在一本武林秘籍中(据后来考证,估计是计算机基础,狂汗-ing),发现了神奇的二进制数. 如果一个正整数m表示成二进制,它的位数为n(不 ...

  9. DLL调试方法

    1.已经做好的dll不能设置:你可以用AfxMessageBox把信息打印出来.2.哪个地方调用的函数 把DLL重新编译一次 在把DLL放到工程里 从新添加一下 然后在你工程调用DLL内容的地方设置断 ...

  10. callback in C

    callback is nothing but passing the function pointer to the code from where you want your handler/ c ...