基于Retrofit2,okhttp3的数据缓存(cache)技术--深入挖掘
发布时间:2021-01-19 03:05:27 所属栏目:大数据 来源:网络整理
导读:副标题#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(); (编辑:温州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |