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

相关推荐

  • 详解Android使用OKHttp3实现下载(断点续传、显示进度)

    OKHttp3是如今非常流行的Android网络请求框架,那么如何利用Android实现断点续传呢,今天写了个Demo尝试了一下,感觉还是有点意思 准备阶段 我们会用到OKHttp3来做网络请求,使用RxJava来实现线程的切换,并且开启Java8来启用Lambda表达式,毕竟RxJava实现线程切换非常方便,而且数据流的形式也非常舒服,同时Lambda和RxJava配合食用味道更佳 打开我们的app Module下的build.gradle,代码如下 apply plugin: 'com.an

  • Android OkHttp的简单使用和封装详解

    Android OkHttp的简单使用和封装详解 1,昨天把okHttp仔细的看了一下,以前都是调用同事封装好了的网络框架,直接使用很容易,但自己封装却不是那么简单,还好,今天就来自我救赎一把,就和大家写写从最基础的OKHttp的简单get.post的使用,再到它的封装. 2,OkHttp的简单使用 首先我们创建一个工程,并在布局文件中添加三个控件,TextView(用于展示获取到json后的信息).Button(点击开始请求网络).ProgressBar(网络加载提示框) ①简单的异步Get请

  • Android的OkHttp包处理用户认证的代码实例分享

    OkHttp 提供了对用户认证的支持.当 HTTP 响应的状态代码是 401 时,OkHttp 会从设置的 Authenticator 对象中获取到新的 Request 对象并再次尝试发出请求.Authenticator 接口中的 authenticate 方法用来提供进行认证的 Request 对象,authenticateProxy 方法用来提供对代理服务器进行认证的 Request 对象. 用户认证的示例: OkHttpClient client = new OkHttpClient();

  • Android使用okHttp(get方式)登录

    本文实例为大家分享了Android使用get方式登录的相关代码,供大家参考,具体内容如下 工具类 package com.liunan.okhttpdemo3post.Utils; import java.io.IOException; import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response;

  • Android使用okHttp(get方式)下载图片

    一.首先下载Jar包 https://github.com/square/okhttp 如果使用android studio只需要加入依赖compile 'com.squareup.okhttp3:okhttp:3.2.0' 二.下载一张图片并显示 使用的是hanlder的方式 package com.liunan.okhttpdemo2; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import

  • Android-Okhttp的使用解析

    okhttp是Android6.0推出的网络框架.由于谷歌在Android6.0的之后,将HttpClient相关属性取消掉,导致Volley框架不能正常使用.所以才有了今天的Okhttp. Okhttp进行网络访问通常有两种方式,一种是get请求,还有一种叫做post请求. 1.OKhttp的get请求 通常,我们使用get方式来请求一个网站,是依靠url地址的.Okhttp使用get方式来请求网站通常有如下的步骤: A.创建OkhttpClient的变量,这个变量相当于是一个全局的执行者.主

  • Android的OkHttp包中的HTTP拦截器Interceptor用法示例

    OkHttp(GitHub:https://github.com/square/okhttp) 的 Interceptor 就如同名称「拦截器」一样,拦截你的 Request 做一些你想做的事情再送出去.例如: 1.自动加上使用者目前使用的语言送出去取得对应语言的回传内容. 2.将 Request 计算出这个 Request 的 sigunature 再附加上送出去. 在 okHttp 中分成 Application Interceptor 和 Network Interceptor 两种. A

  • 使用Android的OkHttp包实现基于HTTP协议的文件上传下载

    OkHttp的HTTP连接基础 虽然在使用 OkHttp 发送 HTTP 请求时只需要提供 URL 即可,OkHttp 在实现中需要综合考虑 3 种不同的要素来确定与 HTTP 服务器之间实际建立的 HTTP 连接.这样做的目的是为了达到最佳的性能. 首先第一个考虑的要素是 URL 本身.URL 给出了要访问的资源的路径.比如 URL http://www.baidu.com 所对应的是百度首页的 HTTP 文档.在 URL 中比较重要的部分是访问时使用的模式,即 HTTP 还是 HTTPS.这

  • 使用OkHttp包在Android中进行HTTP头处理的教程

    HTTP 头处理 HTTP 头是 HTTP 请求和响应中的重要组成部分.在创建 HTTP 请求时需要设置一些 HTTP 头.在得到 HTTP 的响应之后,也会需要对其中包含的 HTTP 头进行解析.从代码的角度来说,HTTP 头的数据结构是 Map<String, List<String>>类型.也就是说,对于每个 HTTP 头,可能有多个值.但是大部分 HTTP 头都只有一个值,只有少部分 HTTP 头允许多个值.OkHttp 采用了简单的方式来区分这两种类型,使得对 HTTP

  • 详解Android中使用OkHttp发送HTTP的post请求的方法

    HTTP POST 和 PUT 请求可以包含要提交的内容.只需要在创建 Request 对象时,通过 post 和 put 方法来指定要提交的内容即可. HTTP POST 请求的基本示例: public class PostString { public static void main(String[] args) throws IOException { OkHttpClient client = new OkHttpClient(); MediaType MEDIA_TYPE_TEXT

  • Android M(6.x)使用OkHttp包解析和发送JSON请求的教程

    关于Android 6.0 Android老版本网络请求: 1,HttpUrlConnection 2,Apache Http Client Android6.0版本网络请求: 1,HttpUrlConnection 2,OkHttp Android6.0版本废弃了老的网络请求,那么它的优势是什么呢? 1,支持SPDY,共享同一个Socket来处理同一个服务器的所有请求 2,如果SPDY不可用,则通过连接池来减少请求延时 3,无缝的支持GZIP来减少数据流量 4,缓存响应数据来减少重复的网络请求

随机推荐