基于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(); (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |