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

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

程序员文章站 2024-03-31 18:15:04
okhttp 可以对 http 响应的内容在磁盘上进行缓存。在进行 http 请求时,如果该请求的响应已经被缓存而且没有过期,okhttp 会直接使用缓存中的响应内容,而不...

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();
     }