基于Retrofit2,okhttp3的数据缓存(cache)技术--深入挖掘

之前写过的文章:基于Retrofit2,okhttp3的数据缓存(cache)技术是局限于:在有网的情况下设置缓存时间t(s),在有网或者无网时都在t(s)之后就会缓存数据清空;这是有很多局限性的;本文着力于进行研究以下四个(2*2)方面:

有网时:
1.每次都请求实时数据;
2.特定时间之后请求数据;(比如:特定时间为20s)
无网时
1.无限时请求有网请求好的数据;
2.特定时间之前请求有网请求好的数据;((比如:特定时间为20s))

下面来研究有网和无网这4种情况(2*2):

效果如下:

sample

部分截图:

这里写图片描述
这里写图片描述
这里写图片描述

具体代码:

 /***
     * 获取服务器数据
     */
    private void initGet() {
        //设置缓存
        File httpCacheDirectory = new File(MainActivity.this.getCacheDir(), "cache_responses_yjbo");
        Cache cache = null;
        try {
            cache = new Cache(httpCacheDirectory, 10 * 1024 * 1024);
        } catch (Exception e) {
            Log.e("OKHttp", "Could not create http cache", e);
        }
        HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
        httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .cache(cache)
                .addInterceptor(interceptor)
                .addNetworkInterceptor(interceptor)
                .addInterceptor(httpLoggingInterceptor)
                .build();

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(HttpService.baseHttp)
                .addConverterFactory(GsonConverterFactory.create())
                .client(okHttpClient)
                .build();

        final HttpService service = retrofit.create(HttpService.class);
        Call<NetWorkClass> call = service.getFirstBlog();
        call.enqueue(new Callback<NetWorkClass>() {
            @Override
            public void onResponse(Call<NetWorkClass> call, retrofit2.Response<NetWorkClass> response) {
                if (response.isSuccessful()) {

                    Toast.makeText(MainActivity.this, "数据请求成功", Toast.LENGTH_SHORT).show();
                    NetWorkClass netWorkClass = response.body();
                    showResult.setText(netWorkClass.toString());

                    showKindAsk.setText("当前是:" + "\n1." + netGetStr + "\n2." + nonetGetStr);
                } else {
                    showResult.setText(response.code() + "--数据请求失败--");
                }
            }

            @Override
            public void onFailure(Call<NetWorkClass> call, Throwable t) {

            }
        });
    }
/***
     * 拦截器,保存缓存的方法
     * 2016年7月29日11:22:47
     */
    Interceptor interceptor = new Interceptor() {

        @Override
        public Response intercept(Chain chain) throws IOException {
            Request request = chain.request();

            if (checkNet(MainActivity.this)) {//有网时
                Response response = chain.proceed(request);
                String cacheControl = request.cacheControl().toString();
                Log.e("yjbo-cache", "在线缓存在1分钟内可读取" + cacheControl);

                switch (netGet) {
                    case 0://总获取实时信息
                        return response.newBuilder()
                                .removeHeader("Pragma")
                                .removeHeader("Cache-Control")
                                .header("Cache-Control", "public, max-age=" + 0)
                                .build();
                    //break;
                    case 1://t(s)之后获取实时信息--此处是20s
                        return response.newBuilder()
                                .removeHeader("Pragma")
                                .removeHeader("Cache-Control")
                                .header("Cache-Control", "public, max-age=" + cacheTime)
                                .build();
                    //break;
                }
                return null;
            } else {//无网时
                switch (nonetGet) {
                    case 0://无网时一直请求有网请求好的缓存数据,不设置过期时间
                        request = request.newBuilder()
                                .cacheControl(FORCE_CACHE)//此处不设置过期时间
                                .build();
                        break;
                    case 1://此处设置过期时间为t(s);t(s)之前获取在线时缓存的信息(此处t=20),t(s)之后就不获取了
                        request = request.newBuilder()
                                .cacheControl(FORCE_CACHE1)//此处设置了t秒---修改了系统方法
                                .build();
                        break;
                }

                Response response = chain.proceed(request);
                //下面注释的部分设置也没有效果,因为在上面已经设置了
                return response.newBuilder()
                        .header("Cache-Control", "public, only-if-cached")
                        .removeHeader("Pragma")
                        .build();
            }

        }

        ;
    };
    //这是设置在多长时间范围内获取缓存里面
    public CacheControl FORCE_CACHE1 = new CacheControl.Builder()
            .onlyIfCached()
            .maxStale(cacheTime, TimeUnit.SECONDS)//CacheControl.FORCE_CACHE--是int型最大值
            .build();

git上的源码:点击这里,喜欢请star哦,您的star是我继续更新的动力,谢谢啦

有问题请联系我:
@author yjbo
@mail :1457521527@qq.com
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值