• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > okhttp3.4.1+retrofit2.1.0实现离线缓存,retrofitokhttp缓存

okhttp3.4.1+retrofit2.1.0实现离线缓存,retrofitokhttp缓存

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了retrofit2.1.0,okhttp3.4.1,retrofit缓存,retrofit2 缓存,retrofit配置缓存等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

okhttp3.4.1+retrofit2.1.0实现离线缓存,retrofitokhttp缓存


关于Retrofit+OkHttp的强大这里就不多说了,还没了解的同学可以自行去百度。这篇文章主要讲如何利用Retrofit+OkHttp来实现一个较为简单的缓存策略:
即有网环境下我们请求数据时,如果没有缓存或者缓存过期了,就去服务器拿数据,并且将新缓存保存下来,如果有缓存而且没有过期,则直接使用缓存。无网环境下我们请求数据时,缓存没过期则直接使用缓存,缓存过期了则无法使用,需要重新联网获取服务器数据。

缓存处理还是很有必要的,它有效的减少服务器负荷,降低延迟提升用户体验,同时也方便用户即使在没网络的情况下也能使用APP。

之前一直有一个疑惑,既然Retrofit已经是对OkHttp的一个封装了,为什么还一直说Retrofit+OkHttp要一起搭配使用,后来才知道其实OKHttp很重要的一个作用,就是对一些网络请求的配置,例如连接超时,读取超时,以及一些缓存配置等。

 

一、添加依赖
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.squareup.okhttp3:okhttp:3.4.1'
compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'

 

二、配置OkHttpClient(设置缓存路径和缓存文件大小) 

File httpCacheDirectory = new File(Environment.getExternalStorageDirectory(), "HttpCache");//这里为了方便直接把文件放在了SD卡根目录的HttpCache中,一般放在context.getCacheDir()中
int cacheSize = 10 * 1024 * 1024;//设置缓存文件大小为10M
Cache cache = new Cache(httpCacheDirectory, cacheSize);
httpClient = new OkHttpClient.Builder()
             .connectTimeout(10, TimeUnit.SECONDS)//设置连接超时
             .readTimeout(10, TimeUnit.SECONDS)//读取超时
             .writeTimeout(10, TimeUnit.SECONDS)//写入超时
             .addNetworkInterceptor(REWRITE_CACHE_CONTROL_INTERCEPTOR)//添加自定义缓存拦截器(后面讲解),注意这里需要使用.addNetworkInterceptor
             .cache(cache)//把缓存添加进来
             .build();

 

三、配置Retrofit

retrofit = new Retrofit.Builder()
                .baseUrl(baseUrl)
                .client(httpClient)//把OkHttpClient添加进来
                .addConverterFactory(GsonConverterFactory.create())
                .build();

 

四、编写拦截器

  我们知道其实Retrofit+OkHttp的缓存主要通过拦截器实现,所以主要做的功夫也在拦截器里面。

 static Interceptor REWRITE_CACHE_CONTROL_INTERCEPTOR = new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {

            Request request = chain.request();
            //网上很多示例代码都对在request请求前对其进行无网的判断,其实无需判断,无网自动访问缓存
//            if(!NetworkUtil.getInstance().isConnected()){
//                request = request.newBuilder()
//                        .cacheControl(CacheControl.FORCE_CACHE)//只访问缓存
//                        .build();
//            }
            Response response = chain.proceed(request);

            if (NetworkUtil.getInstance().isConnected()) {
                int maxAge = 60;//缓存失效时间,单位为秒
                return response.newBuilder()
                        .removeHeader("Pragma")//清除头信息,因为服务器如果不支持,会返回一些干扰信息,不清除下面无法生效
                        .header("Cache-Control", "public ,max-age=" + maxAge)
                        .build();
            } else {
                //这段代码设置无效
//                int maxStale = 60 * 60 * 24 * 28; // 无网络时,设置超时为4周
//                return response.newBuilder()
//                        .header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale)
//                        .removeHeader("Pragma")
//                        .build();
            }
            return response;
        }
    };

到这里,其实已经可以实现了我们开头所说的缓存效果了。

  但是,上面设置的每个接口缓存时间都一样,例如我现在想让不同接口的缓存数据失效时间都不一样,甚至有些接口不缓存数据,应该怎么做呢?其实也很简单

首先我们只需要在接口前面添加@Headers参数(max-age代表缓存时间,单位为秒,示例中表示缓存失效时间为60s,想要多少时间可以自行设置),不设置@Headers参数则不进行缓存。

    @Headers("Cache-Control:public ,max-age=60")
    @GET("getBusiness.action")//商店信息
    Call<RestaurantInfoModel> getRestaurantInfo(@Query("userId") String userId,@Query("businessId") String businessId);

 同时,我们的缓存拦截器也要做下简单的修改(去掉了之前的注释代码)

    static Interceptor REWRITE_CACHE_CONTROL_INTERCEPTOR = new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {

            Request request = chain.request();
            Response response = chain.proceed(request);

            if (NetworkUtil.getInstance().isConnected()) {
                //获取头部信息
                String cacheControl =request.cacheControl().toString();
                return response.newBuilder()
                        .removeHeader("Pragma")//清除头信息,因为服务器如果不支持,会返回一些干扰信息,不清除下面无法生效
                        .header("Cache-Control", cacheControl)
                        .build();
            }
            return response;
        }
    };

 

*注意:

1.只能缓存Get请求的接口,不能缓存Post请求的接口

2.OkHttpClient需要用.addNetworkInterceptor添加缓存拦截器,不能使用.addInterceptor,也无需两者同时使用。

3.此方法无需服务器端任何操作,适用于服务器端没有其他缓存策略,如果服务器端有自己的缓存策略代码应该做相应的修改,以适应服务器端。

 

附上所有代码:

/**
 * 简单封装的Retroit初始化类
 */
public cl



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • okhttp3.4.1+retrofit2.1.0实现离线缓存,retrofitokhttp缓存

相关文章

  • 2017-05-26Android--获取系统时间的方式介绍
  • 2017-05-224.4.2 ContentProvider再探——Document Provider
  • 2017-05-26Android 优秀的开源框架整理,android开源框架
  • 2017-05-26Android Call(打电话)的基本知识详解,androidcall
  • 2017-05-26Android--绑定服务调用服务的方法
  • 2017-05-26安卓开发与分析者的利器--安卓右键工具
  • 2017-05-26android开发网络连接工具类(一),android工具类
  • 2017-05-26AndroidStudio项目提交(更新)到github最详细步骤
  • 2017-05-26Android MotionEvent详解
  • 2017-05-26常用代码块,代码

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 实现图片拖动,图片拖动
    • Android Service 两种启动方式的区别,androidservice
    • mysql查询语句分析 explain用法
    • android handler传递消息机制,androidhandler
    • Android_事件纷发
    • Android打印机--小票打印格式及模板设置
    • android开发之路02(浅谈BroadcastReceiver),broadcastreceiver
    • Android Bitmap占用内存计算公式,androidbitmap
    • 3.7 AnsyncTask异步任务
    • 独立开发者的个人经验之谈,独立开发者的

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有