retrofit:Json数据缓存

2017-04-26  本文已影响0人  whstywh
Photo by Danyu Wang on Unsplash

缓存机制

缓存的优点:

缓存机制的原理:

我们请求服务器,然后由服务器返回的响应(Response) 中添加的头信息中有 Cache-control 字段,它的目的是告诉客户端是要从本地读取缓存还是直接从服务器获取消息。它有不同的值,每一个值有不同的作用。
如果我们需要满足这样的一个需求:“没有网络时读取本地缓存,有网络时获取服务器最新数据”就得做出判断:

因此,需要Interceptor(拦截器)得到response的heade信息,从而进行以上配置。

 Interceptor mInterceptor = new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Request request = chain.request();
            //当没有网络时
            if (!isConnectingToInternet()) {
                request = request.newBuilder()
                         //CacheControl.FORCE_CACHE; //仅仅使用缓存
                         //CacheControl.FORCE_NETWORK;// 仅仅使用网络
                        .cacheControl(CacheControl.FORCE_CACHE)
                        .build(); 
            }

            Response proceed = chain.proceed(request);

            if (isConnectingToInternet()) {
                //有网络时
                return proceed.newBuilder()
                         //清除头信息
                        .removeHeader("Pragma")
                         //设置在线缓存时间为60秒,
                        .header("Cache-Control", "public, max-age=" + 60)
                        .build();
            } else {
                //没网络时
                int maxTime = 4 * 24 * 60 * 60;//离线缓存时间:4周
                return proceed.newBuilder()
                        .removeHeader("Pragma")
                         //设置离线缓存时间为4周,
                        .header("Cache-Control", "public, only-if-cached, max-stale=" + maxTime)
                        .build();
            }
        }
    };

总缓存时间=在线缓存时间+设置离线时的缓存时间(max-stale和max-age的和)

max-stale的值:指的是缓存的过期时间,设置它后,会将数据缓存,如果超过了过期时间,那么我们认为数据过期了,会重新从获取网络数据进行更新,但是,它是不会删除缓存的。
max-age的值:指的是缓存的生存时间,超过了就会删除该请求的缓存。

        File file = new File(getCacheDir(), "whstywh");//缓存文件路径
        Cache cache = new Cache(file, 10 * 1024 * 1024);//缓存文件大小为10MB

缓存文件全是以url的md5加密字段为文件名,每一个response分两个文件保存,以.0和.1结尾的文件区分。 进去看里面的内容如下:


        OkHttpClient client = new OkHttpClient.Builder()
                .addInterceptor(mInterceptor)//添加应用拦截器
                .addNetworkInterceptor(mInterceptor)//添加网络拦截器
                .cache(cache)//设置缓存
                .connectTimeout(5, TimeUnit.SECONDS)//连接超时 5秒
                .build();

        Retrofit retrofit = new Retrofit.Builder()
                .client(client)
                .baseUrl("http://www.yuyigufen.com/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();

                ...

对于retrofit的学习才刚刚开始!
retrofit :入门
retrofit :Json数据缓存
retrofit :文件断点下载

上一篇 下一篇

猜你喜欢

热点阅读