加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2021-01-19 01:26:57 所属栏目:大数据 来源:网络整理
导读:之前写过的文章:基于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();

(编辑:湖南网)

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

热点阅读