加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2021-01-19 18:29:09 所属栏目:大数据 来源:网络整理
导读:副标题#e# 之前写过的文章:基于Retrofit2,okhttp3的数据缓存(cache)技术是局限于:在有网的情况下设置缓存时间t(s),在有网或者无网时都在t(s)之后就会缓存数据清空;这是有很多局限性的;本文着力于进行研究以下四个(2*2)方面: 有网时:1.每次都
副标题[/!--empirenews.page--]

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

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

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

这里写图片描述


这里写图片描述

这里写图片描述

这里写图片描述

具体代码:

/*** * 获取服务器数据 */
    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",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",only-if-cached")
                        .removeHeader("Pragma")
                        .build();
            }

        }

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

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读