zoukankan      html  css  js  c++  java
  • Android okHttp网络请求之缓存控制Cache-Control

    前言:

        前面的学习基本上已经可以完成开发需求了,但是在项目中有时会遇到对请求做个缓存,当没网络的时候优先加载本地缓存,基于这个需求我们来学习一直okHttp的Cache-Control。

         okHttp相关文章地址:

    Cache-Control:

         Cache-Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令有下几种:

    • Public指示响应可被任何缓存区缓存。
    • Private指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。
    • no-cache指示请求或响应消息不能缓存
    • no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。
    • max-age指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。
    • min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应。
    • max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。

    CacheControl.java类介绍:

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

    okHtitp知识扩展:

    1.)Interceptor拦截器,见名知意就是拦截操作,这里用来拦截Request对其做一些特殊处理,举例:比如上面我们使用到了CacheControl,我们怎么拦截一个请求在网络不可用的时候使用CacheControl.FORCE_CACHE;
            OkHttpClient.Builder newBuilder = mOkHttpClient.newBuilder();
             newBuilder.addInterceptor(new Interceptor() {
                @Override
                public Response intercept(Chain chain) throws IOException {
                    Request request = chain.request();
                    boolean connected = NetworkUtil.isConnected(context);
                    if (!connected) {
                        request = request.newBuilder().cacheControl(CacheControl.FORCE_CACHE).build();
                    }
                    Response response = chain.proceed(request);
    
                    return response;
                }
            });
    2.)OkHttp 提供了对用户认证的支持。当 HTTP 响应的状态代码是 401 时,OkHttp 会从设置的 Authenticator 对象中获取到新的 Request 对象并再次尝试发出请求。Authenticator 接口中的 authenticate 方法用来提供进行认证的 Request 对象.
            OkHttpClient client = new OkHttpClient();
            client.newBuilder().authenticator(new Authenticator() {
                @Override
                public Request authenticate(Route route, Response response) throws IOException {
                    String credential = Credentials.basic("user", "password");
                    return response.request().newBuilder()
                            .header("Authorization", credential)
                            .build();
                }
            });

    小结:okHttp的简单使用到此介绍完毕,至于很多高级使用还有待研究。接下来准备研究下OkHttp与retrofit结合使用。

  • 相关阅读:
    HDU 2433 Travel (最短路,BFS,变形)
    HDU 2544 最短路 (最短路,spfa)
    HDU 2063 过山车 (最大匹配,匈牙利算法)
    HDU 1150 Machine Schedule (最小覆盖,匈牙利算法)
    290 Word Pattern 单词模式
    289 Game of Life 生命的游戏
    287 Find the Duplicate Number 寻找重复数
    283 Move Zeroes 移动零
    282 Expression Add Operators 给表达式添加运算符
    279 Perfect Squares 完美平方数
  • 原文地址:https://www.cnblogs.com/whoislcj/p/5537640.html
Copyright © 2011-2022 走看看