当前位置: 移动技术网 > IT编程>移动开发>Android > Android的HTTP扩展包OkHttp中的缓存功能使用方法解析

Android的HTTP扩展包OkHttp中的缓存功能使用方法解析

2019年07月24日  | 移动技术网IT编程  | 我要评论

红色海龟,dq9金手指,夏天开的花有什么

okhttp 可以对 http 响应的内容在磁盘上进行缓存。在进行 http 请求时,如果该请求的响应已经被缓存而且没有过期,okhttp 会直接使用缓存中的响应内容,而不需要真正的发出 http 请求到远程服务器。在创建缓存时需要指定一个磁盘目录和缓存的大小。在代码清单 8 中,创建出 cache 对象之后,通过 okhttpclient 的 setcache 进行设置。通过 response 对象的 cacheresponse 和 networkresponse 方法可以得到缓存的响应和从实际的 http 请求得到的响应。如果该请求的响应来自实际的网络请求,则 cacheresponse 方法的返回值为 null;如果响应来自缓存,则 networkresponse 的返回值为 null。okhttp 在进行缓存时会遵循 http 协议的要求,因此可以通过标准的 http 头 cache-control 来控制响应的缓存时间。

设置响应缓存的示例

public class cacheresponse {
  public static void main(string[] args) throws ioexception {
  int cachesize = 100 * 1024 * 1024;
  file cachedirectory = files.createtempdirectory("cache").tofile();
  cache cache = new cache(cachedirectory, cachesize);
  okhttpclient client = new okhttpclient();
  client.setcache(cache);

  request request = new request.builder()
      .url("http://www.baidu.com")
      .build();

  response response = client.newcall(request).execute();
  if (!response.issuccessful()) {
    throw new ioexception("服务器端错误: " + response);
  }

  system.out.println(response.cacheresponse());
  system.out.println(response.networkresponse());
  }
}

cache-control
cache-control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置cache-control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令有下几种:
public指示响应可被任何缓存区缓存。
private指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。
(1)no-cache指示请求或响应消息不能缓存
(2)no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。
(3)max-age指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。
(4)min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应。
(5)max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。
cachecontrol类详细介绍:
1.)常用的函数:如下代码,里面已经加了注释就不一一解释了,每个函数都是对应一个缓存指令设置

          

final cachecontrol.builder builder = new cachecontrol.builder();
     builder.nocache();//不使用缓存,全部走网络
      builder.nostore();//不使用缓存,也不存储缓存
      builder.onlyifcached();//只使用缓存
      builder.notransform();//禁止转码
      builder.maxage(10, timeunit.milliseconds);//指示客户机可以接收生存期不大于指定时间的响应。
      builder.maxstale(10, timeunit.seconds);//指示客户机可以接收超出超时期间的响应消息
      builder.minfresh(10, timeunit.seconds);//指示客户机可以接收响应时间小于当前时间加上指定时间的响应。
      cachecontrol cache = builder.build();//cachecontrol

2.)两个cachecontrol常量介绍:

     cachecontrol.force_cache; //仅仅使用缓存
      cachecontrol.force_network;// 仅仅使用网络


举例,我们设置一个有效期为10秒的cachecontrol

 

      final cachecontrol.builder builder = new cachecontrol.builder();
      builder.maxage(10, timeunit.milliseconds);
      cachecontrol cache = builder.build();

3.)请求时如何使用

final cachecontrol.builder builder = new cachecontrol.builder();
      builder.maxage(10, timeunit.milliseconds);
      cachecontrol cache = builder.build();
      final request request = new request.builder().cachecontrol(cache).url(requesturl).build();
      final call call = mokhttpclient.newcall(request);//
      call.enqueue(new callback() {
        @override
        public void onfailure(call call, ioexception e) {
          failedcallback("访问失败", callback);
          log.e(tag, e.tostring());
        }

        @override
        public void onresponse(call call, response response) throws ioexception {
          if (response.issuccessful()) {
            string string = response.body().string();
            log.e(tag, "response ----->" + string);
            successcallback((t) string, callback);
          } else {
            failedcallback("服务器错误", callback);
          }
        }
      });
      return call;
    } catch (exception e) {
      log.e(tag, e.tostring());
    }

以上如果cache没有过去会直接返回cache而不会发起网络请求,若过期会自动发起网络请求。注意:如果您使用force_cache和网络的响应需求,okhttp则会返回一个504提示,告诉你不可满足请求响应。所以我们加一个判断在没有网络的情况下使用

    //判断网络是否连接
    boolean connected = networkutil.isconnected(context);
     if (!connected) {
       request = request.newbuilder().cachecontrol(cachecontrol.force_cache).build();
     }

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网